约数个数 (排列组合中的乘法原理)
問題 A: 約數(shù)個數(shù)
時間限制: 2 Sec??內(nèi)存限制: 128 MB
提交: 313??解決: 39
提交 狀態(tài) 討論版
命題人:admin
題目描述
p^q表示p的q次方,正整數(shù)M可以分解為M=(p1^a1)*(p2^a2)*(p3^a3)*……*(pn^an)的形式,其中p1,p2……pn為質(zhì)數(shù)(大于1并且只能被1和自身整除的數(shù)叫做質(zhì)數(shù))。a1,a2……an為整數(shù)。例如18=(2^1)*(3^2),45=(3^2)*(5^1)。
給出n和一個質(zhì)數(shù)g,以及正整數(shù)M分解后的形式,求M的所有約數(shù)中,有多少能被g整除。
?
輸入
第一行 兩個數(shù) n和g。 0<n<=10 1<g<100。g為質(zhì)數(shù)。
第二行 n個數(shù) p1到pn? 1<pi<100 pi為質(zhì)數(shù)(1<=i<=n)。
第三行 n個數(shù) a1到an? 0<=ai<=20 ai為整數(shù)(1<=i<=n)。
?
保證對于任意的i,j(i != j) ,pi != pj
?
輸出
一個數(shù)
表示M的所有約數(shù)中,有多少能被g整除。
?
樣例輸入
<span style="color:#212529">2 3 3 5 2 2 </span>?
樣例輸出
<span style="color:#212529">6</span>?
提示
樣例解釋:
M=(3^2)*(5^2)=9*25=225
225能被3整除的約數(shù)有3 9 15 45 75 225 共6個。
?
?
因為數(shù)據(jù)很大,所以是不能直接求的。但是我們注意到pi為質(zhì)數(shù),所以如果pi中沒有g(shù),那么個數(shù)為零,如果有g(shù),那么通過排列組合中的乘法原理可以求出答案來。因為不是讓你求其中具體有那幾個約束,所以只用乘法原理求個數(shù)就行了。
代碼:
#include <iostream> //約數(shù)個數(shù)。 #include <algorithm> using namespace std; typedef long long ll; const int inf=307; struct node {int p,a; } arr[inf];bool compare(node a,node b) {return a.p<b.p; }int main() {int n,g;scanf("%d %d",&n,&g);int flag=-1;for(int i=0;i<n;i++)scanf("%d",&arr[i].p);for(int i=0;i<n;i++)scanf("%d",&arr[i].a);sort(arr,arr+n,compare);for(int i=0;i<n;i++)if(arr[i].p==g&&arr[i].a!=0){flag=i;} if(flag==-1){cout<<0<<endl;return 0;}ll sum=0;ll ans=arr[flag].a;for(int i=0;i<n;i++){if(i!=flag){ans*=(arr[i].a+1);}}cout<<ans<<endl;//一直進行計算從sum中選出零個一直到sum個來。//排列組合公式的使用。 return 0; }?
總結(jié)
以上是生活随笔為你收集整理的约数个数 (排列组合中的乘法原理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: noip 2017棋盘
- 下一篇: codeforces div2 C.