1. 程式人生 > >luogu P1829 [國家集訓隊]Crash的數字表格 / JZPTAB

luogu P1829 [國家集訓隊]Crash的數字表格 / JZPTAB

背景:

以下圖片均來自我的 P D F PDF 檔案,謝絕轉載。

題目傳送門:

https://www.luogu.org/problemnew/show/P1829

題意:

在這裡插入圖片描述

思路:

在這裡插入圖片描述
在這裡插入圖片描述

程式碼:

懶得打了,是題解的。

#include<bits/stdc++.h>
#define N 10010000 using namespace std; inline void read(int &x) { x=0; static int p;p=1; static char c;c=getchar(); while(!isdigit(c)){if(c=='-')p=-1;c=getchar();} while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();} x*=p; } const long long mod=20101009; int n,m; bool
vis[N]; int cnt,prim[N],mu[N]; long long sum[N]; void get_mu(int maxn) { mu[1]=1; for(int i=2;i<=maxn;i++) { if(!vis[i]){prim[++cnt]=i;mu[i]=-1;} for(int j=1;j<=cnt&&prim[j]*i<=maxn;j++) { vis[i*prim[j]]=1; if(i%prim[j]==0)
break; else mu[i*prim[j]]=-mu[i]; } } for(int i=1;i<=maxn;i++)(sum[i]=sum[i-1]+1ll*mu[i]*1ll*i%mod*1ll*i%mod)%=mod; } int main() { // freopen(".in","r",stdin); // freopen(".out","w",stdout); read(n);read(m); int max_rep=0; get_mu(max_rep=min(n,m)); long long ans=0; long long inv2=(mod+1ll)/2ll; long long summ=0; for(int d=1;d<=max_rep;d++) { int maxx=n/d,maxy=m/d,minn=min(maxx,maxy); summ=0ll; for(int l=1,r;l<=minn;l=r+1ll) { r=min(maxx/(maxx/l),maxy/(maxy/l)); (summ+=(sum[r]-sum[l-1])%mod*(((1ll+maxx/l)%mod*1ll*(maxx/l)%mod*inv2%mod)%mod)%mod*(((1ll+maxy/l)%mod*1ll*(maxy/l)%mod*inv2%mod)%mod)%mod)%=mod; } (ans+=summ*1ll*d)%=mod; } cout<<(ans%mod+mod)%mod<<endl; return 0; }