题目描述
给定一个n长度的数组A=a1,a2,a3.....an,数组元素均为偶数,现在定义一个半公倍数X如下:
-
对于所有的i∈[1,n],都存在一个非负整数p,满足
题解
请你找到在区间[1,M]的范围内,有多少个数组A的半公倍数X。
首先很明显的是,X一定是所有的公倍数,因为原式可变形为
其次,X一定是所有的奇数倍,因为原式还可以写成
有了这两个东西,其实就可以算了。
假设X为当前所求的最小半公倍数,我们还得验证一下这个X是否可行(我就在这里WA了很多发),也就是这个X是否是的奇数倍。
如果都满足条件了,答案就看M/X的奇偶性
-
如果M/X为奇数,答案为M/X/2+1
-
如果M/X为偶数,答案为M/X/2
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
int a[maxn];
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
int lcm=1;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(lcm>1e9){
continue;
}
lcm=lcm*a[i]/2/__gcd(lcm,a[i]/2);
}
//printf("debug %lld\n",lcm);
int flag=0;
for(int i=1;i<=n;i++){
int temp=lcm*2/a[i];
if(temp%2==0){
flag=1;
break;
}
}
if(flag){
puts("0");
return 0;
}
int cnt=m/lcm;
if(cnt&1){
cnt=cnt/2+1;
}
else{
cnt=cnt/2;
}
printf("%lld\n",cnt);
return 0;
}