约数个数 (排列组合中的乘法原理)
問題 A: 約數個數
時間限制: 2 Sec??內存限制: 128 MB
提交: 313??解決: 39
提交 狀態 討論版
命題人:admin
題目描述
p^q表示p的q次方,正整數M可以分解為M=(p1^a1)*(p2^a2)*(p3^a3)*……*(pn^an)的形式,其中p1,p2……pn為質數(大于1并且只能被1和自身整除的數叫做質數)。a1,a2……an為整數。例如18=(2^1)*(3^2),45=(3^2)*(5^1)。
給出n和一個質數g,以及正整數M分解后的形式,求M的所有約數中,有多少能被g整除。
?
輸入
第一行 兩個數 n和g。 0<n<=10 1<g<100。g為質數。
第二行 n個數 p1到pn? 1<pi<100 pi為質數(1<=i<=n)。
第三行 n個數 a1到an? 0<=ai<=20 ai為整數(1<=i<=n)。
?
保證對于任意的i,j(i != j) ,pi != pj
?
輸出
一個數
表示M的所有約數中,有多少能被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整除的約數有3 9 15 45 75 225 共6個。
?
?
因為數據很大,所以是不能直接求的。但是我們注意到pi為質數,所以如果pi中沒有g,那么個數為零,如果有g,那么通過排列組合中的乘法原理可以求出答案來。因為不是讓你求其中具體有那幾個約束,所以只用乘法原理求個數就行了。
代碼:
#include <iostream> //約數個數。 #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; }?
總結
以上是生活随笔為你收集整理的约数个数 (排列组合中的乘法原理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: noip 2017棋盘
- 下一篇: codeforces div2 C.