HDU 4135 容斥原理

HDU 4135 容斥原理

链接
在这里插入图片描述
题意:给你一个区间 [ a , b ] [a,b] ,求这个区间内与n互质的数的个数。
题解:可以先求出 [ 1 , b ] [1,b] 内与n互质的数的个数,然后再求出 [ 1 , a 1 ] [1,a-1] 内与n互质的数的个数,然后用前者减去后者即是答案。二者都可以采用容斥原理求。对容斥原理不了解的可以看链接。首先求出n的所有质因子,然后dfs求容斥系数。
代码:

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int mod = 200907;
typedef long long LL;


const int MAXN = 1e5+100;
LL prime[MAXN+10];
void getprime()
{
    for(int i = 0; i < MAXN; i++)   prime[i] = 0;
    for(int i = 2; i <= MAXN; i++)
    {
        if(!prime[i])   prime[++prime[0]] = i;
        for(int j = 1; j <= prime[0]&&prime[j]<=MAXN/i; j++)
        {
            prime[prime[j]*i] = 1;
            if(i%prime[j]==0)break;
        }
    }
}
//分解因子
LL factor[100][2];
int fatcnt;
void getfactors(int x)
{
    fatcnt = 0;
    int tmp = x;
    for(int i = 1; prime[i]<=tmp/prime[i];i++)
    {
        if(tmp%prime[i]==0)
        {
            factor[fatcnt][0] = prime[i];
            while(tmp%prime[i] == 0)
            {
                factor[fatcnt][1]++;
                tmp /= prime[i];
            }
            fatcnt++;
        }
    }
    if(tmp!=1)
    {
        factor[fatcnt][0] = tmp;
        factor[fatcnt][1] = 1;
        fatcnt++;
    }
}
//求容斥系数
LL fact[1000][2]; //第一列存容斥因子,第二列存符号
int facnt;
void dfs(LL cur, LL st,LL type)
{
    if(st==fatcnt)
    {
        fact[facnt][0] = cur;
        fact[facnt][1] = type;
        facnt++;
        return ;
    }
    dfs(cur,st+1,type);
    dfs(cur*factor[st][0],st+1,-type);
}

LL solve(LL n)
{
    LL ans = 0;
    for(int i = 0;i<facnt;i++)
    {
        ans += fact[i][1]*n/fact[i][0];
    }
    return ans;
}

int main()
{
    int t, cas = 0;
    scanf("%d", &t);
    getprime();
    while(t--)
    {
        LL a,b,n;
        scanf("%lld%lld%lld", &a, &b, &n);
        memset(factor,0,sizeof(factor));
        memset(fact,0,sizeof(fact));
        facnt = 0;
        getfactors(n);
        dfs(1,0,1);

        LL ans = solve(b)-solve(a-1);
        printf("Case #%d: %lld\n", ++cas,ans);
    }
    return 0;
}
发布了27 篇原创文章 · 获赞 13 · 访问量 1709

猜你喜欢

转载自blog.csdn.net/weixin_43855330/article/details/103057261