题解:P16345 阿瓦的数列

· · 题解

题解:阿瓦的数列

一道大水题,其实我也调了好久。

思路

这不是很明显的一个递归吗。 是递归就有递归式,本题的递推式也是题目给你的:

本以为直接递推就行了,注意要特判: ### [TLE](https://www.luogu.com.cn/record/275169439) Code: ``` #include<bits/stdc++.h> #define int long long using namespace std; void arr(){ int x,y,n; cin>>x>>y>>n; int z=0; if(n==1){ cout<<x<<endl; return ; } if(n==2){ cout<<y<<endl; return ; } for(int i=3;i<=n;i++){ z=(x%i)*(y%i)%i; x=y; y=z; } cout<<y<<endl; } signed main(){ int t; cin>>t; while(t--){ arr(); } return 0; } ``` 暴力只得到了少少的 40 分,看来要考虑优化。 我们发现从第 3 个数开始就要将 $f_i \bmod i$,所以 $f_3$ 的取值只能是 $[0,2]$ 中的整数,$f_4$ 的取值只能是 $[0,3]$ 中的整数。 通过 $f_3$,$f_4$ 枚举发现,$f_{29}<2$,$f_{30}<2$,也就是说当 $i>28$ 时 $f_i<2$。 如果 $n<29$ 直接暴力递推就行了,否则分别讨论 $f_{29}$,$f_{30}$ 是否为 0 就行了。 十年 OI 一场空,不开 long long 见祖宗! ### [AC]() Code ``` #include<bits/stdc++.h> #define int long long using namespace std; void arr(){ int x,y,n; cin>>x>>y>>n; if(n==1){ cout<<x<<endl; return ; } if(n==2){ cout<<y<<endl; return ; } int z; for(int i=3;i<=n;i++){ z=(x%i)*(y%i)%i; if(z==0){ cout<<0<<endl; return ; } if(y==1 and z==1){ cout<<1<<endl; return ; } x=y; y=z; } cout<<y<<endl; } signed main(){ int t; cin>>t; while(t--){ arr(); } return 0; } ``` 题解来之不易,点个赞再走吧……