计蒜客NOIP2017提高组模拟赛(五)day2-成绩统计

传送门


 用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 }

 

posted @ 2017-10-30 18:44  white_hat_hacker  阅读(324)  评论(0编辑  收藏  举报