poj1286

来源:互联网 发布:nginx 无reload 编辑:程序博客网 时间:2024/06/05 03:32

【题意】

正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.


原创粉丝点击