hdu 4215 Number Theory?(***)

推荐!!!数论,打表实现

/*
E[i]表示欧拉函数,F[i]表示因子个数
思路:欧拉函数,随着因子的增大,会成递增趋势(并非严格递增),因子个数也会递增,但两个函数的递增趋势相差很大,所以可以使用打表来发现规律。程序打表后发现,30之后开始,结果都为10。
*/
#include <cstdio>
int ans[]={0,1,1,2,2,4,5,5,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,9,9,9,9,9,9,10};
int main()
{
	//freopen("f://data.in","r",stdin);
	int T,N;
	scanf("%d",&T);
	for(int cas=1;cas<=T;cas++)
	{
		scanf("%d",&N);
		if(N<30)
			printf("Case %d: %d\n",cas,ans[N]);
		else
			printf("Case %d: 10\n",cas);
	}
	return 0;
}

//打表程序
#include <cstdio>
#include <cstring>
const int nMax=100;
int E[nMax],F[nMax];
int gcd(int a,int b)
{
	return a%b==0?b:gcd(b,a%b);
}
int main()
{
	freopen("f://data.out","w",stdout);
	memset(E,0,sizeof(E));
	memset(F,0,sizeof(F));
	for(int i=1;i<nMax;i++)
	{
		for(int j=1;j<=i;j++)
		{
			if(gcd(i,j)==1)
				E[i]++;
			if(i%j==0)
				F[i]++;
		}
	}
	for(int i=1;i<nMax;i++)
	{
		if(i%10==0)
			printf("\n");
		printf("%d ",E[i]);
	}
	printf("\n***************************************\n");
	for(int i=1;i<nMax;i++)
	{
		if(i%10==0)
			printf("\n");
		printf("%d ",F[i]);
	}
	printf("\n***************************************\n");
	for(int i=1;i<nMax;i++)
	{
		int ans=0;
		for(int l=1;l<=i;l++)
			for(int r=l;r<=i;r++)
			{
				int sum1=0,sum2=0;
				for(int k=l;k<=r;k++)
				{
					sum1+=E[k];
					sum2+=F[k];
				}
				if(sum1==sum2)
					ans++;
			}
		printf("%d,",ans);
		if(i%10==0) 
			printf("\n");
	}
	printf("\n***************************************\n");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值