洛谷 P1876 开灯

P1876 开灯
首先说下看别人后的解释:

.

如果被操控若干次后,
灯开着则意味着灯被操控了奇数次
而一个灯被操控的次数是他的约数的个数
一个数n=p1a1∗p2a2…pkak
的约数个数是(a1+1)(a2+1)…(ak+1)
而且这个数是奇数意味这所有的ai都是偶数
也就是说,n=m2
其中m=p1a1/2∗p2a2/2…pkak/2
所以,所有的最终的满足条件的n都是完全平方数

二.

而我刚刚开始就想着用数组一直循环,不过数大了肯定会超时,
然后就先把50以内的循环出答案,然后就发现规律了
找规律的代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h> 
int main(void)
{
 int i,j,k,l,n, a[100];
 for(n=1;n<=50;n++)
 {
  printf("n:%d* ",n);
  memset(a,0,sizeof(a));
  for(i=1;i<=n;i++)//轮回 
  {
   for(j=1;j<=n;j++)//反 
   {
    for(k=1;k<=n;k++)
    {
     if(k%j==0)
     {
      a[k]=abs(a[k]-1); 
     } 
    } 
   }
  }
  printf("开着的灯:");
  for(i=1;i<=n;i++)
  {
   if(a[i]==1)
   {
    printf("%d ",i);
   }
  }
  printf("\n");
 }
 } 

AC后的代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
	long long i,j,k,l,n,m;
	scanf("%lld",&n);
	for(i=1;i<=sqrt(n);i++)
	{
		if(i==1)
		printf("%lld",i*i);
		else printf(" %lld",i*i);
	}
	return 0;	
}

猜你喜欢

转载自blog.csdn.net/qq_44009311/article/details/87217533
今日推荐