问题 H: 计数JS
问题 H: 计数JS
时间限制: 1 Sec 内存限制: 128 MB
提交: 219 解决: 26
[提交] [状态] [命题人: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
题意:很清楚
题解:简单容斥定理,如果都是质数的话都会,这个题就是求最小公倍数进行容斥(当时没想到),状压循环T,我也是服了~~还要搜索,我很迷~~ 数据较大用的java,表示石油大网站没有python 差评~~
状压代码:(T了)
package www;
import java.math.BigInteger;
import java.util.*;
public class Main{
static final int MAX = 100;
static Scanner cin = new Scanner(System.in);
static BigInteger [] a = new BigInteger[MAX];
public static void main(String[] args) {
int n;
long m;
boolean ff=false;
n=cin.nextInt();m=cin.nextLong();
for (int i = 0; i < n;i++) {
a[i]=cin.nextBigInteger();
}
BigInteger sum = BigInteger.ZERO;
for (int msk = 1; msk < (1<<n); ++msk) {
BigInteger mult = BigInteger.ONE;
int bits = 0;
BigInteger cao = BigInteger.ZERO;
boolean f=false;
for (int i=0; i < n; ++i){
if ((msk&(1<<i))!=0) {
++bits;
cao=mult;
mult=mult.multiply(a[i]);
mult=mult.divide(cao.gcd(a[i]));
if(mult.compareTo(BigInteger.valueOf(m))>0){
f=true;
break;
}//大于m 下面的cur一定是0 没必要继续算
}
}
if(!f){
BigInteger cur=BigInteger.valueOf(m).divide(mult);
if (bits%2==1) sum=sum.add(cur);
else sum=sum.subtract(cur);
}
}
System.out.println(BigInteger.valueOf(m).subtract(sum));
}
}
搜索代码:(AC)
package www;
import java.math.BigInteger;
import java.util.*;
public class Main{
static final int MAX = 100;
static Scanner cin = new Scanner(System.in);
static BigInteger [] a = new BigInteger[MAX];
static BigInteger ans = BigInteger.ZERO;
static int n;
static long m;
static void dfs(int index,BigInteger w,int bits) {
if(w.compareTo(BigInteger.valueOf(m))>0) return;//大于m 下面的cur一定是0 没必要继续算
if(index==n) {
if(bits==0) return;
BigInteger cur=BigInteger.valueOf(m).divide(w);
if (bits%2==1) ans=ans.add(cur);
else ans=ans.subtract(cur);
return;
}
dfs(index+1,w,bits);
if(w.compareTo(BigInteger.ZERO)==0) w=a[index];
else {
BigInteger tmp = w;
w=w.multiply(a[index]);
w=w.divide(tmp.gcd(a[index]));
}
dfs(index+1,w,bits+1);
}
public static void main(String[] args) {
n=cin.nextInt();m=cin.nextLong();
for (int i = 0; i < n;i++) {
a[i]=cin.nextBigInteger();
}
dfs(0,BigInteger.ONE,0);
System.out.println(BigInteger.valueOf(m).subtract(ans));
}
}