A - How many integers can you find
题意:有m个数,求小于n的数中有多少数是m中至少一个数的倍数
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL a[50];
LL GCD(LL a,LL b) {
return b==0?a:GCD(b,a%b);
}
LL LCM(LL a,LL b){
return a/GCD(a,b)*b;
}
int main() {
LL n,m,x;
while(cin>>n>>m&&(n+m)) {
int tot=0;
for(LL i=0; i<m; i++){
cin>>x;
if(x>0&&x<n)
a[tot++]=x;
}
LL sum=0;
for(LL i=1; i<(1<<tot); i++) {
LL lcm=1, cnt=0;
for(LL j=0; j<tot; j++) {
if(i&(1<<j)) {
lcm=LCM(lcm,a[j]);
cnt++;
}
}
if(cnt!=0){
if(cnt&1)//奇数加
sum+=(n-1)/lcm;
else//偶数减
sum-=(n-1)/lcm;
}
}
cout<<max((LL)0,sum)<<endl;
}
return 0;
}
B - Co-prime
题意:有A B N,求A到B之间有多少数与N互质
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[110];
int main()
{
int t;
cin>>t;
for(int k=1;k<=t;k++){
ll A,B,n;
cin>>A>>B>>n;
int num = 0;
for(int i=2;i*i<=n;i++){
if(n%i==0){
num++;
a[num]=i;
}
while(n%i==0)
n/=i;
}
if(n!=1){
num++;
a[num]=n;
}
ll Ssum=0;
for(int i=1;i<(1<<num);i++){
ll sum=1,cnt=0;
for(int j=0;j<num;j++){
if(1&(i>>j)){
sum*=a[j+1];
cnt++;
}
}
if(cnt&1)
Ssum=Ssum-(A-1)/sum+B/sum;
else
Ssum=Ssum+(A-1)/sum-B/sum;
}
printf("Case #%d: %lld\n",k,B-A+1-Ssum);
}
return 0;
}