1. 程式人生 > >【反演復習計劃】【COGS2432】愛蜜莉雅的施法

【反演復習計劃】【COGS2432】愛蜜莉雅的施法

spa span lcp lld set sin wap swap nbsp

也是一個反演。

第一次手動推出一個簡單的式子,激動.jpg

技術分享

 1 #include<bits/stdc++.h>
 2 #define N 10000010
 3 using namespace std;
 4 typedef long long ll;
 5 int n,m,prime[N],cnt,vis[N];
 6 ll f[N];
 7 void calcpre(){
 8     f[1]=1;cnt=0;memset(vis,1,sizeof(vis));
 9     for(int i=2;i<=N;i++){
10         if(vis[i]){prime[++cnt]=i;f[i]=i-2
;} 11 for(int j=1;j<=cnt;j++){ 12 int t=i*prime[j];if(t>N)break; 13 vis[t]=0;int p=prime[j]; 14 if (i%p)f[t]=f[i]*f[p]; 15 else{ 16 f[t]=(i/p)%p?f[i/p]*(p-1)*(p-1):f[i]*p; 17 break; 18 } 19 }
20 } 21 for(int i=2;i<=N;i++)f[i]+=f[i-1]; 22 } 23 inline int read(){ 24 int f=1,x=0;char ch; 25 do{ch=getchar();if(ch==-)f=-1;}while(ch<0||ch>9); 26 do{x=x*10+ch-0;ch=getchar();}while(ch>=0&&ch<=9); 27 return f*x; 28 } 29 int main(){ 30 freopen("
aimiliyausemagic.in","r",stdin); 31 freopen("aimiliyausemagic.out","w",stdout); 32 calcpre();int T=read(); 33 while(T--){ 34 n=read();m=read(); 35 if(n>m)swap(n,m);ll ans=0; 36 for(int i=1,j=1;i<=n;i=j+1){ 37 j=min(n/(n/i),m/(m/i)); 38 ans+=(f[j]-f[i-1])*(n/i)*(m/i); 39 } 40 printf("%lld\n",ans); 41 } 42 return 0; 43 }

【反演復習計劃】【COGS2432】愛蜜莉雅的施法