一、容斥原理
#include<iostream>
#include<algorithm>using namespace std;const int N = 20;typedef long long LL;
int n,m;
int p[N];int main()
{cin>>n>>m;for(int i = 0;i < m;i ++) cin>>p[i];int res = 0;//从1枚举到2^m(位运算)for(int i = 1;i < 1 << m; i ++){//t表示当前质数的乘积//cnt表示当前选法中有几个集合int t = 1,cnt = 0;for(int j = 0;j < m;j ++){//当前位为1if(i >> j & 1){cnt ++;if((LL)t * p[j] > n){t = -1;break;}t *= p[j];}}if(t != -1){//奇数为加,偶数则减if(cnt % 2) res += n / t;else res -= n / t;}}cout<<res<<endl;return 0;
}
二、简单博弈论
- 先手必胜状态:可以走到某一必败状态(Yes)
- 先手必败状态:走不到任何一个必败状态(No)
#include<iostream>
#include<algorithm>using namespace std;int main()
{int n;in res = 0;scanf("%d",&n);while(n --){int x;scanf("%d",&x);//异或res ^= x;}if(res) puts("Yes");else puts("No");return 0;
}