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\n",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\n",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\n",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\n",i2->se); 91 } 92 anss=max(anss,mp(nn+ta,t2)); 93 } 94 printf("%d %d",anss.fi,anss.se); 95 return 0; 96 }