bzoj2005

参考代码:

http://blog.csdn.net/popoqqq/article/details/39924877

http://blog.csdn.net/z690933166/article/details/11844077


这道题首先要推出每个点 (i,j) 所消耗的能量就是 (gcd(i,j)-1)*2+1,所以可以把所有最大公约数相同的合并起来,那么接下来就是枚举最大公约数,最后就是怎样求出最大公约数为某个特定的值的对数,可以用容斥。

2015.10.27:

给定 x,y,求 a<=x,b<=y,gcd(a,b)=d 的对数,有以下几种方法:

1. http://www.docin.com/p-826560286.html (容斥原理,加一点改进,但是与本题中所用的容斥稍有不同)


(第一次遭遇命运的时候我们措手不及,所以在命运面前惨败,第二次我们已经全副武装。   ——江南 《龙族》)

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 100010

long long int gcdcou[N];

int main(){
    long long int n,m;
    long long int ans;

    while(scanf("%lld%lld",&n,&m)!=EOF){
        ans=0;

        for(int i=min(n,m);i>=1;i--){
            gcdcou[i]=(n/i)*(m/i);
            for(int j=i+i;j<=min(n,m);j=j+i){
                gcdcou[i]-=gcdcou[j];
            }

            ans+=((i-1)*2+1)*gcdcou[i];
        }

        printf("%lld\n",ans);

    }

    return 0;
}


转载于:https://www.cnblogs.com/ahahah/p/4918169.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值