題目描述
給定一個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;
}