pku 1662 还是找规律的
说明:这道题目感觉比较难想,开始我真的拿出了几枚硬币在那边试,试着把比较小的情况找出来,看能够找到一般的规律;
结果发现:似乎是部分有规律,还有的看着有规律,但是很难统一起来...到最后终于发现了似乎总的翻的次数和硬币总数有关,是硬币数的整数倍或者整数倍减一,(这个到现在我也不知道为什么),然后试着看某枚硬币回到原来状态需要多少,然后这样做,结果就对了^_^
#include<stdio.h>
int main()
{
int t,n,k,k0,p,flag,ch;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==1)
{
printf("2\n");
continue;
}
k=n/2,k0=n%2;
p=1,flag=0,ch=0;
if(k0)
{
do
{
if(p%2)
{
flag=1-flag;
p=k+1-p/2;
}
else p=k+1+p/2;
ch++;
}while(p!=1);
}
else
{
do
{
if(p%2)
p=k+(p+1)/2;
else
{
flag=1-flag;
p=k-p/2+1;
}
ch++;
}while(p!=1);
}
__int64 ch2=ch;
__int64 ans=ch2*n-flag;
printf("%I64d\n",ans);
}
return 0;
}
结果发现:似乎是部分有规律,还有的看着有规律,但是很难统一起来...到最后终于发现了似乎总的翻的次数和硬币总数有关,是硬币数的整数倍或者整数倍减一,(这个到现在我也不知道为什么),然后试着看某枚硬币回到原来状态需要多少,然后这样做,结果就对了^_^
#include<stdio.h>
int main()
{
int t,n,k,k0,p,flag,ch;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==1)
{
printf("2\n");
continue;
}
k=n/2,k0=n%2;
p=1,flag=0,ch=0;
if(k0)
{
do
{
if(p%2)
{
flag=1-flag;
p=k+1-p/2;
}
else p=k+1+p/2;
ch++;
}while(p!=1);
}
else
{
do
{
if(p%2)
p=k+(p+1)/2;
else
{
flag=1-flag;
p=k-p/2+1;
}
ch++;
}while(p!=1);
}
__int64 ch2=ch;
__int64 ans=ch2*n-flag;
printf("%I64d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号