HDU——1286找新朋友(欧拉函数)

找新朋友

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11446    Accepted Submission(s): 6119


Problem Description
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
 

Input
第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
 

Output
对于每一个N,输出一行新朋友的人数,这样共有CN行输出。
 

Sample Input
  
  
2 25608 24027
 

Sample Output
  
  
7680 16016
 

Author
SmallBeer(CML)

解法1:
根据题目可知,寻找新朋友的数量就是减去旧朋友的数量,寻找旧朋友的数量就是与给定数存在公约数。直接打表计算,首先进行给定数字的公约数的寻找,然后让其做乘法循环,如果做乘法之后的结果还是小于给定的数字,那么该情况符合要求,就将该数字做下标的数组置为1。最后遍历一遍查找1的数量即为最终结果。

#include<stdio.h>
#include<string.h>

int m[33000];
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int x;
		while(n--)
		{
			memset(m,0,sizeof(m));
			int count = 0;
			scanf("%d",&x);
			for(int i=2;i<=x/2;i++)
			{
				if(x%i==0)
				{
					for(int j=1;j*i<x;j++)
					{
						m[j*i]=1;
					} 
				}
			}
			for(int i=1;i<x;i++)
			{
				if(m[i])
					count++;
			}
			printf("%d\n",x-count-1);
		}
	}
	return 0;
 } 

解法2:
欧拉函数模板题目, C(n)=n*(1-1/P1)(1-1/P2)....(1-1/Px),其中C(n)表示小于等于n的数字中与n互质的数字数量,P1,P2表示n的因子。求得的结果就是新朋友的数量。此时需要注意当出现类似:8=2*2*2的情况时,只有P=2一种情况。

#include<stdio.h>
#include<string.h>

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int x;
		while(n--)
		{
			int count = 0,i;
			scanf("%d",&x);
			count=x;
			for(i=2;i<=x;i++)
			{
				if(x%i==0)
				{
					count-=count/i;
					//排除因子相同的情况 
					while(x%i==0)
						x/=i; 
				}
			}
			
			printf("%d\n",count);
		}
	}
	return 0;
 } 





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值