Generating function

普通篇
HDU1171

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int t1[8100],t2[8100] ;
/*
i:第I個表達式
j:第j個變量
k:乘第i個表達式子(1+x^i + x^2i + ...) 
*/ 
int main(){
    int num[4] ={0};
    while(cin>>num[1]>>num[2]>>num[3]){
        if(num[1]+num[2]+num[3]==0)break;
        int n = num[1]+num[2]*2+num[3]*5 ;
        for(int i=0; i<=n ;++i){
            t1[i] = t2[i] = 0;
        }
        int t[4] = {0,1,2,5};
        for(int i=0; i<=num[1]; ++i){
            t1[i] = 1;
        }       
        for(int i=2; i<=3; ++i){ 
            for(int j=0; j<=n; ++j){
                for(int k=0; k<=num[i]; k++){ 
                    t2[j+t[i]*k] += t1[j];
                }
            }
            for(int k=0; k<=n; ++k){
                t1[k] = t2[k];
                t2[k] = 0;
            }
        }
        int ans = -1;
        for(int i=0; i<=n; ++i){
            if(!t1[i]) {
                ans=i;
                break;
            }
        }
        if(ans!=-1){
            cout << ans << endl;
        }
        else {
            cout << n+1 << endl;
        }
    }
    return 0;
}

HDU 1085

#include <iostream>
#include <cstdio>
using namespace std;
long long t1[350],t2[350] ;
/*
i:第I個表達式
j:第j個變量
k:乘第i個表達式子(1+x^i + x^2i + ...) 
*/ 
int main(){
    int n ;
    while(cin >> n && n){
        for(int i=0; i<=n; ++i){
            t1[i] = 1;
            t2[i] = 0;
        }   
        for(int i=2; i*i<=n ; ++i){
            for(int j=0; j<=n; ++j){
                for(int k=0; k+j<=n; k+=i*i){
                    t2[k+j] += t1[j];
                }
            } 
            for(int k=0; k<=n; ++k){
                t1[k] = t2[k];
                t2[k] = 0;
            }
        }
        cout << t1[n] << endl;
    }
    return 0;
}

HDU1028

#include <iostream>
#include <cstdio>
using namespace std;
long long t1[350],t2[350] ;
/*
i:第I個表達式
j:第j個變量
k:乘第i個表達式子(1+x^i + x^2i + ...) 
*/ 
int main(){
    int n; 
    while(cin >> n){
        for(int i=0; i<=n; ++i){
            t1[i] = 1;
            t2[i] = 0;
        }
        for(int i=2; i<=n; ++i){    // biaodashi
            for(int j=0; j<=n; ++j){    // dijge
                for(int k=0; k+j<=n; k+=i){//chengdiige
                    t2[j+k] += t1[j];   //xishu
                }

            }
            for(int k=0; k<=n; ++k){
                    t1[k] = t2[k];
                    t2[k] = 0;
            }
        }
        cout<<t1[n]<<endl;
    }
    return 0 ;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章