您的位置:首页 > 其它

UVA 10325(容斥原理)

2018-01-27 13:54 288 查看
/*

    UVA 10325

    题目大体就是说

    给你一个数n,再给你m个数

    问你1~n之中有多少个数与这m个数都互质

    输入之后直接用容斥原理就行了

    顺便记录一下

    if(i&(1<<j))与if(((i>>j)&1)==1)效果是一样的

*/

#include<iostream>

#include<algorithm>

#include<string.h>

#include<string>

#include<stdio.h>

#include<math.h>

#define ll long long

#define INF 2147483647

#define N 50

#define PI acos(-1)

#define EPS 1e-8

using namespace std;

ll gcd(ll a,ll b)

{

    return b?gcd(b,a%b):a;

}

ll lcm(ll a,ll b)

{

    return a/gcd(a,b)*b;

}

int main()

{

    ll n,m;

    while(cin>>n>>m)

    {

        ll a[20];

        for(int i=1;i<=m;i++)

            cin>>a[i];

        ll sum=0;

        for(int i=1;i<(1<<m);i++)

        {

            ll res=1,flag=0;

            for(int j=1;j<=m;j++)

            {

                if((((i>>(j-1)))&1)==1)

                {

                    res=lcm(res,a[j]);

                    if(res>n)

                        break;

                    flag++;

                }

            }

            if(res>n)

                continue;

            if(flag%2==0)

                sum=sum-n/res;

            else

                sum=sum+n/res;

        }

        cout<<n-sum<<endl;

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: