传送门
用hash,因为map的复杂度可能在这题中因为多一个log卡掉,但是hash不会
可能因为这个生成的随机数有循环的情况,不是完全均匀的
而且这题hash表的长度也可以开的很大
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 #include<set> 8 #include<queue> 9 #include<vector> 10 #define INF 0x7f7f7f7f 11 #define ll long long 12 #define pii pair<ll,int> 13 #define MOD 10000005 14 using namespace std; 15 int n; 16 ll m; 17 pii H[MOD]; 18 vector<int> vs; 19 void insert(ll x){ 20 int t=x%MOD; 21 while(H[t].first&&H[t].first!=x){ 22 t++; 23 if(t>=MOD){ 24 t=0; 25 } 26 } 27 if(!H[t].second) vs.push_back(t); 28 H[t]=make_pair(x,H[t].second+1); 29 } 30 int main() 31 { 32 // freopen("data.in","r",stdin); 33 scanf("%d",&n); 34 scanf("%lld",&m); 35 for(int i=1;i<=n/100;i++){ 36 ll t;scanf("%lld",&t); 37 insert(t); 38 for(int j=2;j<=100;j++){ 39 ll q=(t*109+107)%m; 40 insert(q); 41 t=q; 42 } 43 } 44 ll ans=0; 45 for(int i=0;i<vs.size();i++){ 46 ans+=((H[vs[i]].second+H[vs[i]].first)/(H[vs[i]].first+1))*(H[vs[i]].first+1); 47 } 48 printf("%lld\n",ans); 49 return 0; 50 }