标签:偶数 分析 highlight bre lib mes void blog html
还是需要看题解T-T
枚举d=gcd(i,j),得到

好了现在就要处理后边这个函数了,可以无脑求,不过107显然会T,当然要O(n)了
然后我们就观察这个函数。。大力分析一下µ可能会带来的贡献
令T=p1a1*p2a2*...*pkak
d=p1b1*p2b2*...*pkbk
若μ(T/d)!=0,那么T/d后各项次数0<=(ai-bi)<=1
分一下类:
①若ai!=aj
我们知道对于f(d)有贡献的是最大次项,设为ax
假如固定d包含约数pax,那么f(d)=ax,T的所有约数d的其他次幂就要选择了。
根据组合数的性质,选择奇数和偶数的方案是一样的,而它对答案f(d)的系数的贡献分别为±1,这样一综合为0
②若所有的a都相等
我们假设对于任意选取方案,f值都不变
那么由于选取奇数个元素和偶数个元素的方案数相等,和仍然为0
但是有一种选取方案,那就是全部选,它的f值就变为了a-1,因为它的最高次幂不是a了
但是它对应的方案选取的f值还是a,所以一综合,我们就要处理掉这个差出来的1
考虑到μ的符号之后,最终结果为(-1)(k+1)
最终结果:故所有a都相等,则g(T)=(-1)(k+1)
然后根据lc大神教的O(n)思路去处理就好啦!记得开long long
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 10100000
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
#define LL long long
int t,n,m;
int notprime[N],prime[N];
LL g[N],K[N],G[N];
void get_pre(){
notprime[1]=1;
pos(i,2,N-10){
if(!notprime[i]){
prime[++prime[0]]=i;
g[i]=1;K[i]=1;G[i]=i;
}
for(int j=1;j<=prime[0]&&prime[j]*i<=N-10;j++){
notprime[i*prime[j]]=1;
if(i%prime[j]==0){
K[i*prime[j]]=K[i]+1;
G[i*prime[j]]=G[i]*prime[j];
int i1=i*prime[j]/G[i*prime[j]];
if(i1==1) g[i*prime[j]]=1;
else{
if(K[i1]==K[i*prime[j]]) g[i*prime[j]]=-g[i1];
else g[i*prime[j]]=0;
}
break;
}
G[i*prime[j]]=prime[j];
K[i*prime[j]]=1;
if(K[i]==1) g[i*prime[j]]=-g[i];
else g[i*prime[j]]=0;
}
}
pos(i,1,N-10) g[i]+=g[i-1];
}
LL get_ans(){
if(n>m) swap(n,m);
LL res(0);
int last(0);
for(int i=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
res+=(n/i)*1ll*(m/i)*1ll*(g[last]-g[i-1]);
}
return res;
}
int main(){
scanf("%d",&t);
get_pre();
while(t--){
scanf("%d%d",&n,&m);
printf("%lld\n",get_ans());
}
return 0;
}
[BZOJ 3309]DZY Loves Math 莫比乌斯反演
标签:偶数 分析 highlight bre lib mes void blog html
原文地址:http://www.cnblogs.com/Hallmeow/p/8006716.html