数列
题目描述
数列{xn}的递推公式如下:
给定 x 0 , a, b, c, n, m,求 x n mod m 的值。
输入格式
一行,六个整数,分别表示 x 0 , a, b, c, n, m。
输出格式
一行,一个整数,表示 x n mod m 的值。
输入样例
1 1 1 1 5 1000000000
输出样例
133904603
数据规模与约定
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long lol; 8 lol a,b,c,n,Mod,x,now,last,f[1000001],st,len,ans; 9 lol qpow(lol x,lol y,lol p) 10 { 11 lol res=1; 12 while (y) 13 { 14 if (y&1) res=res*x%p; 15 x=x*x%p; 16 y>>=1; 17 } 18 return res; 19 } 20 int vis[1000001]; 21 int main() 22 { 23 int i; 24 lol p,inv; 25 cin>>x>>a>>b>>c>>n>>Mod; 26 memset(vis,-1,sizeof(vis)); 27 if (n<=1000000) 28 { 29 x%=Mod; 30 last=x; 31 for (i=1; i<=n; i++) 32 { 33 now=(a*last%Mod*last%Mod+b*last%Mod)%Mod+c; 34 now%=Mod; 35 last=now; 36 } 37 cout<<last; 38 } 39 else if (Mod<=10000000) 40 { 41 x%=Mod; 42 last=x; 43 vis[x]=0; 44 f[0]=x; 45 for (i=1; i; i++) 46 { 47 now=(a*last%Mod*last%Mod+b*last%Mod)%Mod+c; 48 now%=Mod; 49 last=now; 50 f[i]=now; 51 if (vis[now]!=-1) break; 52 vis[now]=i; 53 } 54 st=vis[f[i]]; 55 len=i-st; 56 while (n>=i) 57 { 58 n-=len; 59 } 60 cout<<f[n]; 61 } 62 else 63 { 64 p=qpow(2,n,Mod-1); 65 inv=qpow(2*a,Mod-2,Mod); 66 now=a*((x+b*inv%Mod)%Mod)%Mod; 67 ans=qpow(now,p,Mod); 68 ans=(ans*qpow(a,Mod-2,Mod)%Mod-b*inv%Mod+Mod)%Mod; 69 cout<<ans; 70 } 71 }