“玲瓏杯”線上賽 Round #17 河南專場 B.震驚,99%+的中國人都會算錯的問題


1138 - 震驚,99%+的中國人都會算錯的問題

Time Limit:4s Memory Limit:128MByte

Submissions:304Solved:84

DESCRIPTION

眾所周知zhu是一個大廚,zhu一直有自己獨特的咸魚制作技巧.
tang是一個咸魚供應商,他告訴zhu在他那里面有NN條咸魚(標號從1到N)可以被用來制作.
每條咸魚都有一個咸魚值KiKi,初始時所有KiKi都是00.
zhu是一個特別的人,他有MM個咸數(咸魚數字), 對於每個咸數xx,他都會讓所有滿足標號是xx倍數的咸魚的咸魚值異或上11.
zhu現在想知道經過了這MM個咸數的篩選之后,最終有多少條的咸魚的咸魚值是11?

INPUT
輸入的第一行包含一個整數 T(1T1000)T(1≤T≤1000),表示有TT組數據. 對於每組數據: 輸入第一行只有兩個整數N(1N109)N(1≤N≤109),M(1M15)M(1≤M≤15). 接下來一行有MM個整數,依次對應zhu的每個咸數(121051≤咸數≤2∗105).
OUTPUT
對於每組數據,輸出答案.
SAMPLE INPUT
2 10 1 3 10 1 1
SAMPLE OUTPUT
3 10
 
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define pb push_back
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
using namespace std;
const int inf=1e9+10;
const ll llinf=1e16+10;
const int maxn=1e5+10;
const int maxm=1e2+10;
const int mod=1e9+7;
ll n;
int m;
ll num[maxm];
ll gcd(ll a,ll b)
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
ll ans;
void dfs(ll k,int pos,int c)
{
    if(pos==m+1)
    {
        if(c%2==1) ans+=n/k*(1<<(c-1));
        else ans-=n/k*(1<<(c-1));
        return ;
    }
    if(k<=n)
    {
        dfs(k,pos+1,c);
        k=k*num[pos]/gcd(k,num[pos]);
        dfs(k,pos+1,c+1);
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int ncas;
    scanf("%d",&ncas);
    while(ncas--)
    {
        ans=0;
        scanf("%lld %d",&n,&m);
        for(int i=1;i<=m;i++)
            scanf("%lld",&num[i]);
        for(int i=1;i<=m;i++)
            dfs(num[i],i+1,1);
        printf("%lld\n",ans);
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM