hdu1575

来源:互联网 发布:ftp 指定端口 编辑:程序博客网 时间:2024/05/16 17:43

水题。。矩阵快速幂

顺便看一下欧拉公式的模板。。。

//矩阵快速幂  #include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<vector> using namespace std;#define inf 9973int mat[12][12];/*int euler(int x)//cout<<euler(9973)<<endl;=9972{// 就是公式int i, res=x;for (i = 2; i < (int)sqrt(x * 1.0) + 1; i++)if(x%i==0) {res = res / i * (i - 1);while (x % i == 0) x /= i; // 保证i一定是素数}if (x > 1) res = res / x * (x - 1);return res;}*/void f(int n,int k){int i,j,u;int ans=0;int tmp[12][12];int res[12][12];memset(res,0,sizeof(res));memset(tmp,0,sizeof(tmp));for(i=0;i<n;i++) res[i][i]=1;  while(k) { if(k&1) { for(i=0;i<n;i++) for(j=0;j<n;j++)   tmp[i][j]=res[i][j];    memset(res,0,sizeof(res)); for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(u=0;u<n;u++) res[i][j]=(res[i][j]+tmp[i][u]*mat[u][j])%inf; } } }  for(i=0;i<n;i++)  for(j=0;j<n;j++)   tmp[i][j]=mat[i][j];      memset(mat,0,sizeof(mat));      for(i=0;i<n;i++)   {    for(j=0;j<n;j++)    {   for(u=0;u<n;u++)    mat[i][j]=(mat[i][j]+tmp[i][u]*tmp[u][j])%inf;    }   }   k>>=1; }for(i=0;i<n;i++){ans+=res[i][i];ans%=inf;}cout<<ans<<endl;}int main(){//freopen("q.in","r",stdin);int cas;int n,k,i,j;scanf("%d",&cas);while(cas--){scanf("%d%d",&n,&k);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&mat[i][j]);mat[i][j]%=inf;}  }f(n,k);}} 


0 0