现在的位置: 首页 > 综合 > 正文

hdu 4215 Number Theory?(打表)

2018年01月12日 ⁄ 综合 ⁄ 共 2220字 ⁄ 字号 评论关闭


题目:

E(N) = |{i | gcd(N, i) = 1, 1 <= i <= N}|
F(N) = |{i | N % i = 0, 1 <= i <= N}|


求有多少区间段[l,r](1<=l<=r<=n),满足上式,输出,

打表后,发现29以后都是10  ^-^

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int answer[31]={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 n,c;
	scanf("%d",&c);
	for(int t=1;t<=c;t++)
	{
		scanf("%d",&n);
		if(n<30)
			printf("Case %d: %d\n",t,answer[n]);
		else
			printf("Case %d: 10\n",t);
	}
	system("pasue");
    return 0;
}


打表程序:

#include<iostream>
#include<cstdio>
using namespace std;
int  gcd(int x,int y)
{
	return y==0?x:gcd(y,x%y);
}
int E[10000],F[10000];
int answer[10000];
int main()
{
   int n;
   while(scanf("%d",&n)!=EOF)
   {
	    memset(E,0,sizeof(E));
	    memset(F,0,sizeof(F));
        for(int i=1;i<=n;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<=1000;i++)
		{
		    printf("%d ",E[i]);
			if(i%20==0)
				printf("\n");
		}
		cout<<"******************************************************************"<<endl;
		for(int i=1;i<=1000;i++)
		{
			printf("%d ",F[i]);
			if(i%20==0)
				printf("\n");	
		}
		cout<<"*******************************************************************"<<endl;
		
		for(int t=1;t<=200;t++)
		{
		    int sumE,sumF,ans=0;
	        for(int i=1;i<=t;i++)
		    {
				 /* sumE=0;//重算了
			     sumF=0;*/
			     for(int j=1;j<=i;j++)
			     {
				   /*sumE+=E[j];
				sumF+=F[j];
				if(j==2)
				{
					printf("sunE=%d***sumF=%d\n\n",sumE,sumF);
				}
				if(sumE==sumF)
				{
					printf("sumE=%d   sumF=%d\n",sumE,sumF);
					printf("j=%d   i=%d\n",j,i);
				    ans++;
				}*/
				    sumE=0;
			        sumF=0;
				    for(int k=j;k<=i;k++)
				    {
                       sumE+=E[k];
			           sumF+=F[k];
			            /*if(sumE==sumF)//放错位置了!!!!!
					{
						printf("sumE=%d   sumF=%d\n",sumE,sumF);
						printf("j=%d   i=%d\n",j,i);
				       ans++;
					}*/
				    }
	                if(sumE==sumF)
			        {
				        /*printf("sumE=%d   sumF=%d\n",sumE,sumF);
					     printf("j=%d   i=%d\n",j,i);*/
				         ans++;
				     }
			     }
		     }
		     //printf("%d***\n",ans);
	     answer[t]=ans;
		}
		for(int i=1;i<=200;i++)
		{
			printf("%d  ",answer[i]);
			if(i%10==0)
				printf("\n");
		}
   }
   system("pause");
   return 0;
}


n取值为前100时,

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
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  10  10  10  10

抱歉!评论已关闭.