容斥原理

来源:互联网 发布:学生赚钱软件 编辑:程序博客网 时间:2024/05/22 17:48

给你n,m,求所有二元组(i,j)的gcd的和(1<=i<=n,1<=j<=m)


例题:https://vjudge.net/contest/198890#problem/D


代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <set>#include <map>#include <stack>#include <vector>#include <queue>#define ri(n) scanf("%d",&n)#define oi(n) printf("%d\n",n)#define rl(n) scanf("%lld",&n)#define ol(n) printf("%lld\n",n)#define rep(i,l,r) for(i=l;i<=r;i++)#define rep1(i,l,r) for(i=l;i<r;i++)using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int epg=10-8;ll dis[100000+10];int main(){    ll n,m;    while(scanf("%lld%lld",&n,&m)==2)    {        ll sum=0;        memset(dis,0,sizeof(dis));        if(n<m)        {            swap(n,m);        }        for(int i=n;i>=1;i--)        {            dis[i]=(n/i)*(m/i);            for(int j=i+i;j<=n;j+=i)            {                //dis[j]=(n/j)*(m/j);                dis[i]-=dis[j];            }            sum+=i*dis[i];        }        //for(int i=1;i<=n;i++)            //sum+=dis[i];        printf("%lld\n",2*sum-n*m);    }    return 0;}


原创粉丝点击