poj1812
C++ TLE,G++可以过。
Problem : 1812 ( Count the Tetris ) Judge Status : Accepted
RunId : 2899931 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
RunId : 2899931 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Tue 31 Aug 2010 04:03:31 PM CST
*File Name: main.cpp
*Description:polya原理。大数乘法直接循环乘的,不知道反复平方法
*会不会快些
\***************************************************************/
//*========================*Head File*========================*\\
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int A[3000],B[3000];
int N,C;
//*=======================*Main Program*=======================*//
using namespace std;
void mul(int* A,int c,int m){//A*=c^m
while(m--){
for(int i=1;i<=A[0];i++){
A[i]*=c;
}
for(int i=1;i<=A[0];i++){
if(A[i]>9999){
A[i+1]+=A[i]/10000;
A[i]%=10000;
}
}
if(A[A[0]+1])
A[0]++;
}
}
void add(int *B,int *A,int m){//B+=A*m
B[0]=max(A[0],B[0]);
for(int i=1;i<=A[0];i++){
B[i]+=A[i]*m;
if(B[i]>9999){
B[i+1]+=B[i]/10000;
B[i]%=10000;
}
}
if(B[B[0]+1])
B[0]++;
}
void div(int*A,int*B){//A=B/8
A[0]=B[0];
for(int i=B[0];i;i--){
A[i]=B[i]/8;
B[i-1]+=(B[i]%8)*10000;
}
if(A[A[0]]==0)
A[0]--;
}
void polya(int c,int n){//polya主函数
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
A[0]=1;A[1]=1;
//旋转置换
if(n&1){//odd
mul(A,c,n*n/4+1);
add(B,A,2);
mul(A,c,n*n/4);
add(B,A,1);
mul(A,c,n*n/2);
add(B,A,1);
}
else{//even
mul(A,c,n*n/4);
add(B,A,2);
mul(A,c,n*n/4);
add(B,A,1);
mul(A,c,n*n/2);
add(B,A,1);
}
//翻转置换
memset(A,0,sizeof(A));
A[0]=A[1]=1;
if(n&1){//odd
mul(A,c,(n*n-n)/2+n);
add(B,A,4);
}
else{//even
mul(A,c,(n*n-n)/2+n);
add(B,A,2);
memset(A,0,sizeof(A));
A[0]=A[1]=1;
mul(A,c,n*n/2);
add(B,A,2);
}
div(A,B);
}
int main(){
//freopen("input","r",stdin);
while(scanf("%d%d",&N,&C)!=EOF){
if(N==1){
printf("%d\n",C);
continue;
}
polya(C,N);
printf("%d",A[A[0]]);
A[0]--;
while(A[0]){
printf("%.4d",A[A[0]]);
A[0]--;
}
printf("\n");
}
}