问题 H: 计数JS
时间限制: 1 Sec 内存限制: 128 MB
提交: 192 解决: 24
[提交] [状态] [命题人:admin]
题目描述
给定一个长度为n的序列a1..an,求m以内的不能被a1..an中任意一个ai整除的正整数有多少个?
输入
第一行两个数n,m
接下来一行n个数,a1..an
输出
共一个数,即m以内的不能被a1..an中任意一个ai整除的正整数有多少个。
样例输入
3 2015
4 5 6
样例输出
1075
提示
对于 30% 的数据,1≤m≤100000
对于另外 30% 的数据,n=3
对于 100% 的数据,1≤n≤20, 1≤m≤1018, 1≤ ai≤109
一看就知道是个容斥定理,对于样例而言,就是找出m以内能整除4或能整除5或能整除6的数的个数,再用m减去即可。但是,这个容斥用到的是lcm,以前没做过,所以不知道,并且lcm会爆long long,所以用java大数。对于样例,求法为。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static int [] a = new int[110];
public static int n;
public static BigInteger m;
public static BigInteger ans;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
n=cin.nextInt();
m=cin.nextBigInteger();
for(int i=1;i<=n;i++){
a[i]=cin.nextInt();
}
ans=m;
dfs(1,BigInteger.ONE,0);
System.out.println(ans.toString());
}
static void dfs(int cur,BigInteger now,int count){
if(cur==n+1){
if(count==0) return ;
else{
if(count%2==1){
ans=ans.subtract(m.divide(now));
}
else{
ans=ans.add(m.divide(now));
}
return ;
}
}
else{
dfs(cur+1, now, count);
BigInteger temp,g;
g=now.gcd(BigInteger.valueOf(a[cur]));
temp=now.multiply(BigInteger.valueOf(a[cur]));
now=temp.divide(g);
dfs(cur+1, now, count+1);
}
}
}