hdu 2284 Solve the puzzle, Save the world!(组合数)

来源:互联网 发布:python中pipy 编辑:程序博客网 时间:2024/06/11 10:59

Solve the puzzle, Save the world!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 163    Accepted Submission(s): 104


Problem Description
In the popular TV series Heroes, there is a tagline "Save the cheerleader, Save the world!". Here Heroes continues, "Solve the puzzle, Save the world!".
Finally, alien invaders visit our planet. They are eccentric and launch attack many rounds. Since trust in prime numbers, each round they send out p killers, here p is a prime number. Countries on our planet unite and assemble an armed troop of n population. And fortunately we get a fatal weakness of enemy from a betrayer. If the ways of choosing m warriors from n is a multiple of p, the killer number, we will win. Otherwise, we will lose. As the greatest programmer of our planet, you are invited to write a program to count the number of m(0≤m≤n) such that C(n, m) is a multiple of prime p.
 

Input
Each line will contain an integer n(1≤n≤10^5) and a prime p(2≤p<10^7), separated by a single space. Process to the end of file.
 

Output
For each test of case, if the world can be saved, output the number of ways, otherwise, output "Where is hero from?"(without quotation), both on a single line.
 

Sample Input
6 25333 127100000 11
 

Sample Output
3Where is hero from?

92301

题意:外星人派出p个杀手(p为素数),地球人从n个人中选出m个组成军队,如果从n中选出m个人的选法是p的倍数就赢,问有多少种赢的方法。对于数学渣的我参考大神思路:剪枝: 因为p为素数,那么它和它的倍数不可能被比它小的数相乘得到。

#include<stdio.h>int main(){int n,p;while(~scanf("%d%d",&n,&p)){if(n==0 || p>n) {//剪枝 printf("Where is hero from?\n");continue;}int cnt=0,ans=0;for(int i=1;i<=n/2;i++){int temp=n-i+1;while(temp%p==0){//求分子中有几个P因子 cnt++;temp/=p;}temp=i;while(temp%p==0){//求分母中有几个p因子 cnt--;temp/=p; }if(cnt<=0) continue;//分子中p因子比分母多的时候才能整除 if(2*i==n) ans++;//m为n的一半时 else  ans+=2; //m和n-m的组合数一样 }if(ans) printf("%d\n",ans);else printf("Where is hero from?\n");}return 0;} 


0 0