zoukankan      html  css  js  c++  java
  • 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");
    }
    }

  • 相关阅读:
    OpenFlow Switch学习笔记(一)——基础概念
    Open vSwitch 给虚拟机网卡限流(QoS)
    MySQL字符集或字符序
    timestamp和datetime
    MySQL Audit日志审计
    sysbench0.4.12测试query_cache_size和query_cache_type
    MySQL 异地 双机房同步之otter
    keep running
    Linux Bonding
    自动化测试-2.seleniumIDE
  • 原文地址:https://www.cnblogs.com/Open_Source/p/1904879.html
Copyright © 2011-2022 走看看