[NOI2010]能量采集

鸽子终于更博了

考虑设$F[i]$为$i$是$m$和$n$公因数的方案数,显然$F[i]=(m/i)*(n/i)$

然后对$i$进行容斥,就能得到$F[i]$为$i$是$m$和$n$最小公因数的方案数

最后套用公式,直接计算答案即可

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<bits/stdc++.h>
using namespace std;
long long m,n,k,ans,f[100001];
int main () {
scanf("%lld%lld",&n,&m); k=min(m,n);
for(register int i=k;i;--i) {
f[i]=(n/i)*(m/i);
for(register int j=i+i;j<=k;j+=i) f[i]-=f[j];
(ans+=(i*2-1)*f[i]);
}
printf("%lld\n",ans);
return 0;
}