Best Solver

 

The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart. 

It is known that y) 

InputAn integer [y]%M.Sample Input

7
0 46337
1 46337
3 46337
1 46337
21 46337
321 46337
4321 46337

Sample Output

Case #1: 97
Case #2: 969
Case #3: 16537
Case #4: 969
Case #5: 40453
Case #6: 10211
Case #7: 17947



循环节题目常见的有两种情况:
1.MOD-1
2.MOD^2-1
通过推导或暴力可求出。

本题循环节MOD^2-1。


#include<bits/stdc++.h>
#define MAX 3
using namespace std;
typedef long long ll;

ll n,MOD;
struct mat{
    ll a[MAX][MAX];
};

mat operator *(mat x,mat y)
{
    mat ans;
    memset(ans.a,0,sizeof(ans.a));
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            for(int k=1;k<=2;k++){
                ans.a[i][j]+=(x.a[i][k]*y.a[k][j]+MOD)%MOD;
                ans.a[i][j]%=MOD;
            }
        }
    }
    return ans;
}
mat qMod(mat a,ll n)
{
    mat t;
    t.a[1][1]=10;t.a[1][2]=-1;
    t.a[2][1]=1;t.a[2][2]=0;
    while(n){
        if(n&1) a=t*a;
        n>>=1;
        t=t*t;
    }
    return a;
}
ll qsortMod(ll a,ll b)
{
    ll ans=1;
    a%=((MOD+1)*(MOD-1));
    while(b){
        if(b&1) ans=ans*a%((MOD+1)*(MOD-1));
        b>>=1;
        a=a*a%((MOD+1)*(MOD-1));
    }
    return ans;
}
int main()
{
    int tt=0,t,i;
    scanf("%d",&t);
    while(t--){
        scanf("%I64d%I64d",&n,&MOD);
        mat a;
        a.a[1][1]=10;a.a[1][2]=0;
        a.a[2][1]=2;a.a[2][2]=0;
        a=qMod(a,qsortMod(2,n));
        printf("Case #%d: %I64d\n",++tt,(a.a[1][1]-1+MOD)%MOD);
        
    }
    return 0;
}

 

相关文章: