1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> using namespace std;
int mod[]={1,10,100,1000,10000}; int m;
struct mat{ int a[10][10]; mat(){memset(a, 0, sizeof(a)); } mat operator *(const mat q){ mat c; for(int i = 1; i <= 2; ++i) for(int k = 1; k <= 2; ++k) if(a[i][k]) for(int j = 1; j <=2; ++j){ c.a[i][j] += a[i][k] * q.a[k][j]; if(c.a[i][j] >= mod[m]) c.a[i][j] %= mod[m]; }return c; } };
mat qpow(mat x, int n){ mat ans; ans.a[1][1] = ans.a[2][2] = 1; while(n){ if(n&1) ans = ans * x; x= x * x; n >>= 1; }return ans; }
int main(){ int a,b,n; int t; scanf("%d", &t); while(t--){ scanf("%d %d %d %d", &a, &b, &n, &m); a %= mod[m]; b %= mod[m]; if(n == 0){ printf("%d\n",a); continue; } else if(n == 1){ printf("%d\n",b); continue; }mat ans; ans.a[1][1] = ans.a[1][2] = ans.a[2][1] = 1; ans = qpow(ans,n-1); printf("%d\n",(ans.a[1][1] * b + ans.a[1][2] * a) % mod[m]); }return 0; }
|