2013年省赛H题

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 }
View Code

 

posted @ 2019-04-28 16:23  WeiAR  阅读(114)  评论(0编辑  收藏  举报