Best Solver
The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart.
It is known that y)
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; }