题意:给出递推式问第k项。
因为最多模1000,因此结果不超过1000,又由于当前项唯一决定下一项,因此1000以内必循环。用map记录循环起点和周期。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const int SZ=70010,INF=0x7FFFFFFF; lon src,a,b,c,mod,k; lon arr[SZ]; map<lon,lon> mp; void init() { cin>>src>>a>>b>>c>>mod>>k; arr[0]=src; lon T=0,pos=0; for(lon i=1;i<SZ;++i) { arr[i]=(a*arr[i-1]*arr[i-1]+b*arr[i-1]+c)%mod; if(mp.find(arr[i])!=mp.end()) { T=i-mp[arr[i]]; pos=mp[arr[i]]; break; } else mp[arr[i]]=i; } if(k<=pos)cout<<arr[k]<<endl; else { cout<<arr[pos+(k-pos)%T]<<endl; } } void work() { } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { init(); //work(); } return 0; }