題目大意:先丟擲公質數的定義,若數 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個讀者依次編號為...