萌新刚学莫比乌斯反演,莫名被WA成了70?
查看原帖
萌新刚学莫比乌斯反演,莫名被WA成了70?
109634
Cyber_Tree楼主2021/2/2 08:49
#include<bits/stdc++.h>
using namespace std;
const int CYH=20101009;
const int N=1e7+10;
int t;
int pri[N],cnt,f[N];
bool vis[N];
void pre(){
	f[1]=1;
	for(int i=2;i<N;i++){
		if(!vis[i]) pri[++cnt]=i,f[i]=(1ll-i)*i%CYH;
		for(int j=1;j<=cnt&&pri[j]*i<N;j++){
			vis[pri[j]*i]=1;
			if(i%pri[j]==0){ f[i*pri[j]]=1ll*f[i]*pri[j]%CYH; break; }
			else f[i*pri[j]]=1ll*f[i]*f[pri[j]]%CYH;
		}
	}
	for(int i=1;i<N;i++) f[i]=((long long)f[i]+f[i-1])%CYH;
	return;
}
int deal(int n,int m){
	long long ans=0;
	for(int l=1,r;l<=min(n,m);l=r+1){
		r=min(n/(n/l),m/(m/l));
		long long n1=n/l,m1=m/l;
		ans+=((n1*(n1+1)/2)%CYH*((m1*(m1+1))/2)%CYH)%CYH*((f[r]-f[l-1]+CYH)%CYH)%CYH;
		ans%=CYH;
	}
	return (ans+CYH)%CYH;
}
int main(void){
//	scanf("%d",&t);
	pre();
	int x,y;
//	while(t--){
		scanf("%d%d",&x,&y);
		printf("%d\n",deal(x,y));
//	}
	return 0;
}

莫名被WA成了70。。。

自我感觉异常正确。。

应该不是没开long long 的问题。。

2021/2/2 08:49
加载中...