题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1817

此题就是一个弱化版本的HDOJ 3923 Invoker,区别在于颜色数都是定死的(所以说是弱化版的),要是不会的同学可以去看看小编的另一篇博客。


#include <stdio.h>
int gcd(int a,int b) {return b?gcd(b,a%b):a;}
long long Pow(long long a,int b)
{
long long c=1;
while(b)
{
if(b&1) c*=a;
a*=a;
b>>=1;
}
return c;
}
long long flip(int n)
{
long long ans;
if(n&1)
return Pow(3LL,n/2+1)*n;
else
{
ans=Pow(3LL,n>>1)*(n>>1);
ans+=Pow(3LL,n/2+1)*(n>>1);
return ans;
}
}
long long spin(int n)
{
int i;
long long ans=Pow(3LL,n);
for(i=1;i<n;i++)
ans+=Pow(3LL,gcd(n,i));
return ans;
}
int main(void)
{
int n;
long long ans;
while(scanf("%d",&n)==1&&n!=-1)
{
if(n==0)
{
puts("0");
continue;
}
if(n==1){
puts("3");
continue;
}
ans=flip(n);
ans+=spin(n);
printf("%I64d\n",ans/(n<<1));
}
return 0;
}