poj 1286
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define ll long long
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int polya(int n)
{
if(n==0)
return 0;
double sum=0;
for(int i=1;i<=n;i++)
{
sum+=pow(3.0,(double)gcd(n,i));
}
if(n&1)
{
sum+=pow(3.0,(double)(n/2+1))*n;
}
else
{
sum+=pow(3.0,(double)(n/2+1))*n/2;
sum+=pow(3.0,(double)(n/2))*n/2;
}
return (int)(sum/n/2);
}
int main()
{
int i,j,n;
while(scanf("%d",&n),n!=-1)
{
printf("%d\n",polya(n));
}
}
poj 2409
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define ll long long
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int polya(double m,int n)
{
if(n==0)
return 0;
double sum=0;
for(int i=1;i<=n;i++)
{
sum+=pow(m,(double)gcd(n,i));
}
if(n&1)
{
sum+=pow(m,(double)(n/2+1))*n;
}
else
{
sum+=pow(m,(double)(n/2+1))*n/2;
sum+=pow(m,(double)(n/2))*n/2;
}
return (int)(sum/n/2);
}
int main()
{
int i,j,n;
int m;
while(scanf("%d%d",&m,&n),n+m)
{
printf("%d\n",polya((double)m,n));
}
}
hdu 1812
高精度,懒得写了
分析:
标准的polya定理问题。
旋转只有 0,90,180,270度三种旋法。
旋0度,则置换的轮换数为n*n
旋90度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n-1)/4+1
旋180度,n为偶数时,则置换的轮换数为n*n/2,n为奇数,则置换的轮换数为(n*n-1)/2+1
旋270度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n-1)/4+1
反射 沿对角反射两种,沿对边中点连线反射两种
n为偶数时,沿对边中点连线反射两种的置换轮换数为 n*n/2
沿对角反射两种的置换轮换数为 (n*n-n)/2+n
n为奇数时,沿对边中点连线反射两种的置换轮换数为 (n*n-n)/2+n
沿对角反射两种的置换轮换数为 (n*n-n)/2+n