AcWing 890. 奶酪宝宝:容斥原理,AC代码。
原题链接
简单
作者:
奶酪宝宝
,
2025-04-15 18:16:00
· 山东
,
所有人可见
,
阅读 1
#include <iostream>
#define ZERO 0
#define ZERO_BIT 0
#define ONE_BIT 1
#define WITHIN_RANGE 0
#define OVER_RANGE 1
using namespace std;
const int N = 1e9 + 10;
const int M = 16 + 10;
int numberCount, primeCount;
int rankToPrime[M];
void declaration(){
scanf("%d%d", &numberCount, &primeCount);
for (int primeRank = 1; primeRank <= primeCount; primeRank ++){
int prime;
scanf("%d", &prime);
rankToPrime[primeRank] = prime;
}
}
int theorem(){
int result = 0;
for (int mask = 1; mask < (1 << primeCount); mask++){
int overRangeFlag = WITHIN_RANGE;
int countOneBit = 0;
int bitRank = 1;
long long primeAccumulation = 1;
for (int maskToOperate = mask; maskToOperate != ZERO && overRangeFlag == WITHIN_RANGE; maskToOperate >>= 1, bitRank ++){
if ((maskToOperate & 1) == ONE_BIT){
if (primeAccumulation * rankToPrime[bitRank] <= numberCount && primeAccumulation * rankToPrime[bitRank] > 0){
primeAccumulation *= rankToPrime[bitRank];
countOneBit ++;
}
else{
overRangeFlag = OVER_RANGE;
}
}
}
if(overRangeFlag == WITHIN_RANGE){
if(countOneBit % 2 ==ZERO) result -= numberCount / primeAccumulation;
else result += numberCount / primeAccumulation;
}
}
return result;
}
void outputResult(int result){
printf("%d", result);
}
int main(){
declaration();
int result = theorem();
outputResult(result);
return 0;
}