HDU 6428 Problem C. Calculate

题意很简单:
这里写图片描述
然后利用 1 * μ * φ = φ的恒等变形去掉GCD,然后就可以线性筛了。
具体式子如下:
这里写图片描述
注意,当模数为二的幂时可以用unsigned类型直接计算,最后再模。(不然会T)
AC Code:

#include<bits/stdc++.h>
#define maxn 10000007
#define mod (1ll<<30)
#define u32 unsigned int
using namespace std;

bool vis[maxn];
int pr[maxn],cnt_pr;
u32 last[maxn],phmu[maxn],f1[maxn],f2[maxn],f3[maxn],deg[maxn];

int main()
{
    phmu[1] = f1[1] = f2[1] = f3[1] = last[1] = 1;
    for(int i=2;i<maxn;i++)
    {
        if(!vis[i]) pr[cnt_pr++] = i , phmu[i] = i - 2 , deg[i] = last[i] = 1 , f2[i] = f3[i] = f1[i] = i;
        for(int j=0;j<cnt_pr && pr[j] * i < maxn;j++)
        {
            vis[i*pr[j]]=1;
            if(i%pr[j]==0)
            {
                last[i*pr[j]] = last[i];
                deg[i * pr[j]] = deg[i] + 1;
                if(last[i] > 1)phmu[i * pr[j]] = phmu[last[i]] * phmu[i / last[i] * pr[j]];
                else
                {
                    if(i>pr[j]) phmu[i * pr[j]] = phmu[i] * pr[j];
                    else phmu[i * pr[j]] = (pr[j]-1) * (pr[j]-1);
                }
                f1[i * pr[j]]  = f1[i] * pr[j];
                f2[i * pr[j]] = f2[i] * (deg[i*pr[j]]%2==1 ? pr[j] : 1);
                f3[i * pr[j]] = f3[i] * (deg[i*pr[j]]%3==1 ? pr[j] : 1);
                break;
            }
            else
            {
                last[i*pr[j]] = i;
                deg[i * pr[j]] = 1;
                phmu[i * pr[j]] = phmu[i] * phmu[pr[j]];
                f1[i * pr[j]] = f1[i] * pr[j];
                f2[i * pr[j]] = f2[i] * pr[j];
                f3[i * pr[j]] = f3[i] * pr[j];
            }
        }
    }

    int T;
    u32 A,B,C;
    for(scanf("%d",&T);T--;)
    {
        scanf("%d%d%d",&A,&B,&C);

        u32 ans = 0;
        for(int i=1;i<=A;i++)
            ans = (ans + phmu[i] * (A/f1[i]* (B/f2[i]) * (C/f3[i])));
        printf("%d\n",ans & ((1<<30)-1));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值