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

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 2 5333 127 100000 11
 

Sample Output
  
  
3 Where 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值