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;
}