BZOJ 2005: [Noi2010]能量采集|容斥原理

做这个题上来就SB..

Ans=i=1nj=1m2gcd(i,j)1

然后我想成2gcd(i,j)的因子个数,各种推式子,各种过不了样例..

gcd(x,y)=i说明,(0,0)到(x,y)能被分成相同的i块,每一块中间都不经过任何整点
龙哥一语道破!!!

求起来类似莫比乌斯反演..很裸的样子

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<iostream>
#define N 100010
#define ll long long
using namespace std;
ll ans,n,m,f[N];
int main()
{
    cin>>n>>m;
    if(n>m)swap(n,m);
    for(int i=n;i;i--)
    {
        f[i]=(n/i)*(m/i);
        for(int j=i+i;j<=n;j+=i)
            f[i]-=f[j];
        ans+=f[i]*(2*i-1);
    }   
    cout<<ans;
    return 0;
}
发布了279 篇原创文章 · 获赞 10 · 访问量 21万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览