So Easy!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission (s): 813 Accepted Submission (s): 226
Problem Description
A sequence Sn is defined:
Where a, B, n, m are positive integers. percent x percent is the ceil of x. For example, limit 3.14 percent = 4. You are to calculate Sn.
You, a top coder, say: So easy!
Input
There are several test cases, each test case in one line contains four positive integers: a, B, n, m. where 0 <a, m <215, (A-1) 2 <B <a2, 0 <B, n <231.The input will finish with the end of file.
Output
For each the case, output an integer Sn.
Sample Input
2 3 1 2013
2 3 2 2013
2 2 1 2013
Sample Output
4
14
4
Here: http://blog.csdn.net/ljd4305/article/details/8987823
In addition, Cn = (a + sqrt (B) ^ n + (a-sqrt (B) ^ n => Cn * (a + sqrt (B) + a-sqrt (B) = (a + sqrt (B) ^ (n + 1) + (a-sqrt (B) ^ (n + 1) + (a * a-B) * (a + sqrt (n) ^ (n-1) + (a * a-B) * (a-sqrt (B )) ^ (n-1) = C (n + 1) + (a * a-B) C (n-1) => C (n + 1) = 2a * Cn + (B-a ^ 2) * C (n-1)
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<iomanip> #define INF 99999999 using namespace std; const int MAX=10; __int64 array[2][2],sum[2][2]; void MatrixMult(__int64 a[2][2],__int64 b[2][2],__int64 mod){ __int64 c[2][2]={0}; for(int i=0;i<2;++i){ for(int j=0;j<2;++j){ for(int k=0;k<2;++k){ c[i][j]+=a[i][k]*b[k][j]; } } } for(int i=0;i<2;++i){ for(int j=0;j<2;++j)a[i][j]=c[i][j]%mod; } } __int64 Matrix(__int64 a,__int64 b,__int64 k,__int64 mod){ array[0][0]=a%mod,array[0][1]=(b%mod+mod)%mod; array[1][0]=1,array[1][1]=0; sum[0][0]=sum[1][1]=1; sum[0][1]=sum[1][0]=0; while(k){ if(k&1)MatrixMult(sum,array,mod); MatrixMult(array,array,mod); k>>=1; } return (a*sum[0][0]+2*sum[0][1])%mod; } int main(){ __int64 a,b,n,m; while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&m)!=EOF){ if(n == 0)printf("I64d\n",1%m); else if(n == 1)printf("%I64d\n",2*a%m); else printf("%I64d\n",Matrix(2*a,b-a*a,n-1,m)); } return 0; } #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>#define INF 99999999using namespace std;const int MAX=10;__int64 array[2][2],sum[2][2];void MatrixMult(__int64 a[2][2],__int64 b[2][2],__int64 mod){__int64 c[2][2]={0};for(int i=0;i<2;++i){for(int j=0;j<2;++j){for(int k=0;k<2;++k){c[i][j]+=a[i][k]*b[k][j];}}}for(int i=0;i<2;++i){for(int j=0;j<2;++j)a[i][j]=c[i][j]%mod;}}__int64 Matrix(__int64 a,__int64 b,__int64 k,__int64 mod){array[0][0]=a%mod,array[0][1]=(b%mod+mod)%mod;array[1][0]=1,array[1][1]=0;sum[0][0]=sum[1][1]=1;sum[0][1]=sum[1][0]=0;while(k){if(k&1)MatrixMult(sum,array,mod);MatrixMult(array,array,mod);k>>=1;}return (a*sum[0][0]+2*sum[0][1])%mod;}int main(){__int64 a,b,n,m;while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&m)!=EOF){if(n == 0)printf("I64d\n",1%m);else if(n == 1)printf("%I64d\n",2*a%m);else printf("%I64d\n",Matrix(2*a,b-a*a,n-1,m));}return 0;}