牛客 小朋友你是否有很多問號 容斥 組合數學

2021-10-05 16:56:57 字數 1360 閱讀 3011

題目大意:先丟擲公質數的定義,若數 num 與 m 個數都互質,則稱 num 為 m 個數的m元公質數,現在給出 n 個數和 m ,需要求出任意 m 個數的所有 m 元公質數(要求公質數也在這 n 個數中)之和

題目分析:讀完題後可能有點迷茫,但是仔細分析一下發現並不難,首先m元公質數要求 m 個數與其互質,且這個公質數也要在 n 個數之中,不難想到可以列舉這 n 個數作為這個m元公質數,然後計算出有多少個數與其互質,既然題目需要選出 m 個數,那就是 c( num , m ) 了,num 是與當前列舉的數所互質的數的個數,c( num , m ) 的意思是有多少組數可以選擇當前列舉的數作為m元公質數,既然讓求和,再乘上這個數就行了

關於怎麼求出有多少個數與某個數互質,可以參考 hdu4135 , 容斥原理的經典例題,套上模板就好了

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const int n=1e5+100;

const int mod=998244353;

ll fac[n],inv[n],a[n],cnt[n];

vectorp[n];

ll q_pow(ll a,ll b)

return ans;

}ll c(int n,int m)

void solve(int pos,ll val)

for(int i=2;i*i<=val;i++)//質因子分解

if(val%i==0)

if(val!=1)

p[pos].push_back(val);

}void init()

int main()

ll ans=0;

for(int i=1;i<=n;i++)//列舉a[i],計算與a[i]互質的有幾個數

}if(tot&1)//奇加偶減

num+=cnt[mul];

else

num-=cnt[mul];

} num=n-num;

ans=(ans+a[i]*c(num,m))%mod;

} printf("%lld\n",ans);

return 0;

}

你是想象之中的那位階乘小朋友嗎

include void print factorial const int n int main 其中n是使用者傳入的引數,其值不超過1000。如果n是非負整數,則該函式必須在一行中列印出n 的值,否則列印 invalid input 階乘使用非套用演算法的情況下,因為int的資料限制,就像你想要...

牛客 判斷ip位址是否有效

題目描述 輸入乙個ip位址串,判斷是否合法。輸入描述 每行有乙個ip位址,ip位址的形式為a.b.c.d,其中a b c d都是整數。輸出描述 可能有多組測試資料,對於每組資料,如果ip位址合法則輸出 yes 否則輸出 no 合法的ip位址為 a b c d都是0 255的整數。1.輸入為任意字串,...

牛客網 北京大學 誰是你的潛在朋友 解題報告

臭味相投 這是我們描述朋友時喜歡用的詞彙。兩個人是朋友通常意味著他們存在著許多共同的興趣。然而作為乙個宅男,你發現自己與他人相互了解的機會並不太多。幸運的是,你意外得到了乙份北大圖書館的圖書借閱記錄,於是你挑燈熬夜地程式設計,想從中發現潛在的朋友。首先你對借閱記錄進行了一番整理,把n個讀者依次編號為...