hdu4990
程序员文章站
2022-03-05 16:21:00
...
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod;
const int N=3;
struct mat
{
ll a[N][N];
};
mat mul(mat c,mat d)
{
mat e;
memset(e.a,0,sizeof(e.a));
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
ll co=0;
for(int k=0;k<N;k++)
{
co=(co+c.a[i][k]*d.a[k][j])%mod;
if(co<0)
co=(co+mod)%mod;
}
e.a[i][j]=co;
}
}
return e;
}
mat qpow(mat k,int x)
{
mat m;
memset(m.a,0,sizeof(m.a));
m.a[0][0]=m.a[1][1]=m.a[2][2]=1;
while(x)
{
if(x&1)
{
m=mul(m,k);
}
x>>=1;
k=mul(k,k);
}
return m;
}
/*void print(mat h)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
printf("%d ",h.a[i][j]);
}
printf("\n");
}
}*/
int main()
{
ll n;
while(scanf("%lld%lld",&n,&mod)!=EOF){
if(n==1)
printf("%lld\n",((1ll%mod)+mod)%mod);
else
{
mat pre;
memset(pre.a,0,sizeof(pre.a));
// pre.a[0][0]=0;
pre.a[0][1]=1;
pre.a[0][2]=1;
mat h;
h.a[0][0]=0;
h.a[0][1]=0;
h.a[0][2]=0;
h.a[1][0]=2;
h.a[1][1]=4;
h.a[1][2]=0;
h.a[2][0]=0;
h.a[2][1]=1;
h.a[2][2]=1;
// printf("*****%d\n",n/2);
mat k=qpow(h,n/2);
//print(k);
k=mul(pre,k);
// print(k);
ll ans;
if(n%2==0)
ans=k.a[0][0];
else
ans=k.a[0][1];
printf("%lld\n",ans);
}
} return 0;
}
构造出来的矩阵为{0,0,0,2,4,0,0,1,1}
人间迷惑行为大赏,,,1e9为什么要用longlong不用就WA
上一篇: 算法(二) -- 二分查找及其变形体
下一篇: SQL