【题意】
正n边形n个顶点用3种颜色染色有多少种方法,对称旋转可得到的算同一种方法
【输入】
每行一个数表示顶点数
数据以-1结束
【输出】
对于每组数据,输出一个数表示方法数
polya计数模板题
if n and 1 = 1 then ans:=n*quick(3,n div 2 + 1) else ans:=(n div 2)*(quick(3,n div 2)+quick(3,n div 2+1)); for i:=1 to n do ans:=ans+quick(3,gcd(i,n)); ans:=ans div (2*n);
虽不明,但觉屌。
program poj1286; var n,i,j,k:longint; ans:int64; function gcd (a,b:longint):longint; var i:longint; begin while a mod b <> 0 do begin i:=a mod b; a:=b; b:=i; end; exit(b); end; function quick (a,b:int64):int64; var i:int64; begin if b=1 then exit(a); if b=0 then exit(1); i:=quick(a,b div 2); if b and 1 = 1 then exit(i*i*a) else exit(i*i); end; begin repeat read(n); if n=-1 then exit; if n=0 then begin writeln(0); continue; end; if n and 1 = 1 then ans:=n*quick(3,n div 2 + 1) else ans:=(n div 2)*(quick(3,n div 2)+quick(3,n div 2+1)); for i:=1 to n do ans:=ans+quick(3,gcd(i,n)); ans:=ans div (2*n); writeln(ans); until false; end.