bzoj3837 [Pa2013]Filary

https://konnyakuxzy.github.io/BZPRO/JudgeOnline/3837.html

https://szkopul.edu.pl/problemset/problem/EatNJj4oyss-xkLw0yMmGghb/site/?key=statement

不会。。。

题解:https://blog.csdn.net/coldef/article/details/69947367

要注意一下平方因子数,不然WA(第一次交WA成51分)

还卡常...

 1 #pragma GCC optimize(3)
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<vector>
 6 #include<tr1/unordered_map>
 7 using namespace std;
 8 #define fi first
 9 #define se second
10 #define mp make_pair
11 #define pb push_back
12 typedef long long ll;
13 typedef unsigned long long ull;
14 typedef pair<int,int> pii;
15 bool nprime[10000010];
16 int prime[1000100],len,f[10000010];
17 int n;
18 int a[100100];
19 #define map tr1::unordered_map
20 map<int,int> ma;
21 map<int,int>::iterator i1;
22 ull dd[10001000];int d2[10001000];
23 map<ull,int> tt;
24 map<ull,int>::iterator i2;
25 pii anss;
26 ull rd()    {return rand()|(ull(rand())<<32);}
27 int main()
28 {
29     //freopen("/tmp/15.in","r",stdin);
30     int i,j,nn,t,p,q,ta,d,pp,nt,t2;
31     srand(2563435);
32     scanf("%d",&n);
33     for(i=1;i<=n;i++)    scanf("%d",&a[i]);
34     for(i=2;i<=10000000;i++)
35     {
36         if(!nprime[i])    prime[++len]=i,f[i]=i;
37         for(j=1;j<=len&&i*prime[j]<=10000000;j++)
38         {
39             nprime[i*prime[j]]=1;f[i*prime[j]]=prime[j];
40             if(i%prime[j]==0)    break;
41         }
42     }
43     for(int ttt=1;ttt<=17;ttt++)
44     {
45         p=rand()%n+1;nn=0;
46         for(i1=ma.begin();i1!=ma.end();++i1)
47         {
48             dd[i1->fi]=d2[i1->fi]=0;
49         }
50         ma.clear();
51         //printf("p%d
",p);
52         for(i=1;i<=n;i++)
53         {
54             if(a[i]==a[p])    nn++;
55             else
56             {
57                 t=abs(a[i]-a[p]);pp=rd();
58                 while(t!=1)
59                 {
60                     q=f[t];nt=0;
61                     ma[q]++;dd[q]^=pp;
62                     //printf("iq%d %d
",i,q);
63                     while(t%q==0)    t/=q,nt++;
64                     if(!d2[q])    d2[q]=nt;
65                     else    d2[q]=min(d2[q],nt);
66                 }
67             }
68         }
69         ta=0;tt.clear();
70         for(i1=ma.begin();i1!=ma.end();++i1)
71         {
72             ta=max(ta,i1->se);
73         }
74         //printf("ta%dnn%d
",ta,nn);
75         for(i1=ma.begin();i1!=ma.end();++i1)
76         {
77             if(i1->se==ta)
78             {
79                 d=dd[i1->fi];
80                 t2=tt.count(d)?tt[d]:1;
81                 nt=d2[i1->fi];
82                 while(nt--)    t2*=i1->fi;
83                 tt[d]=t2;
84             }
85         }
86         t2=0;
87         for(i2=tt.begin();i2!=tt.end();++i2)
88         {
89             t2=max(t2,i2->se);
90             //printf("i2se%d
",i2->se);
91         }
92         anss=max(anss,mp(nn+ta,t2));
93     }
94     printf("%d %d",anss.fi,anss.se);
95     return 0;
96 }
原文地址:https://www.cnblogs.com/hehe54321/p/9549282.html