2013年省赛H题
你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4。
想法真的是非常巧妙啊
N=100000
构造两个数组,f1[N],间隔为A
f2[1e4]间隔为A^N,中间用f1来填补
f[x]=f1[x%N]*f2[x/N]%P;
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cmath> 6 #include<ctime> 7 #include<set> 8 #include<map> 9 #include<stack> 10 #include<cstring> 11 #define inf 2147483647 12 #define ls rt<<1 13 #define rs rt<<1|1 14 #define lson ls,nl,mid,l,r 15 #define rson rs,mid+1,nr,l,r 16 #define N 100000 17 #define For(i,a,b) for(long long i=a;i<=b;i++) 18 #define p(a) putchar(a) 19 #define g() getchar() 20 21 using namespace std; 22 long long T,ans,cnt; 23 long long n,A,K,a,b,m,P; 24 long long f1[100010],f2[100010],f[1000010]; 25 26 void in(long long &x){ 27 long long y=1; 28 char c=g();x=0; 29 while(c<'0'||c>'9'){ 30 if(c=='-')y=-1; 31 c=g(); 32 } 33 while(c<='9'&&c>='0'){ 34 x=(x<<1)+(x<<3)+c-'0';c=g(); 35 } 36 x*=y; 37 } 38 void o(long long x){ 39 if(x<0){ 40 p('-'); 41 x=-x; 42 } 43 if(x>9)o(x/10); 44 p(x%10+'0'); 45 } 46 47 void predeal(){ 48 f1[0]=f2[0]=1; 49 For(i,1,N) 50 f1[i]=f1[i-1]*A%P; 51 For(i,1,1e4) 52 f2[i]=f2[i-1]*f1[N]%P; 53 } 54 55 int main(){ 56 in(T); 57 while(T--){ 58 in(n);in(A);in(K);in(a);in(b);in(m);in(P); 59 predeal(); 60 f[1]=K; 61 For(i,2,n) 62 f[i]=(a*f[i-1]+b)%m; 63 ans=0; 64 For(i,1,n){ 65 ans+=f1[f[i]%N]*f2[f[i]/N]%P; 66 ans%=P; 67 } 68 cout<<"Case #"<<++cnt<<": "<<ans<<endl; 69 } 70 return 0; 71 }