HDU 6428 Problem C. Calculate

版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/81989203

题意很简单:
这里写图片描述
然后利用 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));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/81989203