BZOJ 2820 YY的GCD


莫比乌斯反演,变换一下for的顺序,预处理一个函数出来。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10000000
using namespace std;
long long t,n,m,prime[maxn/10],miu[maxn+50],f[maxn+50],top=0;
bool vis[maxn+50];
void get_table()
{
    miu[1]=1;f[1]=0;
    for (long long i=2;i<=maxn;i++)
    {
        if (!vis[i])
        {
            vis[i]=true;
            prime[++top]=i;miu[i]=-1;f[i]=1;
        }
        for (long long j=1;j<=top && i*prime[j]<=maxn;j++)
        {
            vis[i*prime[j]]=true;
            if (!(i%prime[j]))
            {
                miu[i*prime[j]]=0;f[i*prime[j]]=miu[i];
                break;
            }    
            else {miu[i*prime[j]]=-miu[i];f[i*prime[j]]=miu[i]-f[i];}
        }
    }
    for (long long i=1;i<=maxn;i++) f[i]+=f[i-1];
}
void work()
{
    scanf("%lld%lld",&n,&m);
    if (n>m) swap(n,m);
    long long l=1,r,ans=0;
    while (l<=n)
    {
        long long r=min(n/(n/l),m/(m/l));
        ans+=(n/l)*(m/l)*(f[r]-f[l-1]);
        l=r+1;
    }
    printf("%lld\n",ans);
}
int main()
{
    scanf("%lld",&t);
    get_table();
    for (long long i=1;i<=t;i++) work();
    return 0;
}

优质内容筛选与推荐>>
1、Luogu P3150 【pb的游戏(1)】
2、SQLSERVER2005中分页功能的使用和对比
3、mvn install
4、SVM公式详解
5、【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号