AtCoder Beginner Contest 150 D - Semi Common Multiple

題目描述

給定一個n長度的數組A=a1,a2,a3.....an,數組元素均爲偶數,現在定義一個半公倍數X如下:

  • 對於所有的i∈[1,n],都存在一個非負整數p,滿足​

題解

請你找到在區間[1,M]的範圍內,有多少個數組A的半公倍數X。

首先很明顯的是,X一定是所有​的公倍數,因爲原式可變形爲​​X=Ai/2+Ai*p

其次,X一定是所有的奇數倍,因爲原式還可以寫成X=\frac{Ai}{2}*(2p+1)

有了這兩個東西,其實就可以算了。

假設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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章