- 题目大意
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 <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cctype>
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
", ans);
}
return 0;
}
by SDUST weilinfox
原文链接:https://www.cnblogs.com/weilinfox/p/12261580.html