A Short problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2349 Accepted Submission(s): 821
Hence they prefer problems short, too. Here is a short one:
Given n (1 <= n <= 1018), You should solve for
where
Please process until EOF (End Of File).
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#define ll long long
using namespace std;
ll n;
typedef vector<ll>vec;
typedef vector<vec>mat;
mat mul(mat &A,mat &B,ll Mod) {
mat C(A.size(),vec(B[0].size()));
for(int i=0; i<A.size(); i++) {
for(int k=0; k<B.size(); k++) {
for(int j=0; j<B[0].size(); j++) {
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%Mod;
}
}
}
return C;
}
mat pow_mod(mat A,ll x,ll Mod) {
mat B(A.size(),vec(A.size()));
for(int i=0; i<A.size(); i++) {
B[i][i]=1;
}
while(x>0) {
if(x&1)B=mul(B,A,Mod);
A=mul(A,A,Mod);
x>>=1;
}
return B;
}
int main() {
//freopen("test.in","r",stdin);
ll Mod[3]= {183120,222222224,1000000007};
while(~scanf("%I64d",&n)) {
if(n==0||n==1) {
printf("%I64d\n",n);
continue;
}
mat A(2,vec(2));
ll ans=0;
for(int i=0; i<3; i++) {
A[0][0]=3;
A[0][1]=1;
A[1][0]=1;
A[1][1]=0;
if(n-1<0)continue;
A=pow_mod(A,n-1,Mod[i]);
n=A[0][0]%Mod[i];
}
printf("%I64d\n",n);
}
return 0;
}