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

 

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