K-Multiple Free set UVA-11246 (容斥原理)

vjudge链接

原题链接

  • 题目大意

1~n 中找到一个最大的集合,使集合中不存在 a,b 两数,使 a*k==b。输出该集合中元素的数量。

  • 分析

只需输出元素的个数,故无需得到每个元素确切的值,只需模拟删除过程并统计数量即可。

容斥原理。首先删除所有 k 的倍数,元素个数变为 n/k ,显然 k^2 的倍数被多删除了一遍,故需要将 k^2 的倍数( n/k^2 个)重新加回,结果 k^3 的倍数又被多加回了一遍,又要减去 n/k^3 个…… 如此循环,直到没有多加和多减。

/*
 *lang C++ 5.3.0
 *user Weilin_C
 */

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
    int num;
    int n, k;

    scanf("%d", &num);
    while (num--) {
        scanf("%d%d", &n, &k);
        int ans=n, pans=n/k, flag=-1;
        while (pans>0) {
            ans+=flag*pans;
            flag=-flag;
            pans/=k;
        }
        printf("%d\n", ans);
    }

    return 0;
}

by SDUST weilinfox
原文链接:https://www.cnblogs.com/weilinfox/p/12261580.html

你可能感兴趣的:(K-Multiple Free set UVA-11246 (容斥原理))