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
/***************************************************************\
*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");
}
}

posted @ 2010-08-31 19:54  open source  阅读(288)  评论(0编辑  收藏