zoukankan      html  css  js  c++  java
  • HDU4658 Integer Partition(整数拆分+判断相同数)

    题意:将n划分为最大值不超过n的若干个数之和,每个数最多出现m-1次。问有多少种方案?

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <cmath>
    #include <stdlib.h>
    #include <time.h>
    #include <algorithm>
    using namespace std;
    const int mod=1e9+7;
    int dp[100010];
    void init()
    {
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=1; i<=100000; i++)
        {
            for(int j=1,r=1; i-(3*j*j-j)/2>=0; j++,r*=-1)
            {
                dp[i]+=dp[i-(3*j*j-j)/2]*r;
                dp[i]%=mod;
                dp[i]=(dp[i]+mod)%mod;
                if(i-(3*j*j+j)/2>=0)
                {
                    dp[i]+=dp[i-(3*j*j+j)/2]*r;
                    dp[i]%=mod;
                    dp[i]=(dp[i]+mod)%mod;
                }
            }
        }
    }
    int solve(int n,int k)
    {
        int ans=dp[n];
        for(int j=1,r=-1; n-k*(3*j*j-j)/2>=0; j++,r*=-1)
        {
            ans+=dp[n-k*(3*j*j-j)/2]*r;
            ans%=mod;
            ans=(ans+mod)%mod;
            if(n-k*(3*j*j+j)/2>=0)
            {
                ans+=dp[n-k*(3*j*j+j)/2]*r;
                ans%=mod;
                ans=(ans+mod)%mod;
            }
        }
        return ans;
    }
    int main()
    {
        init();
        int t,n,k;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&k);
            printf("%d
    ",solve(n,k));
        }
        return 0;
    }
  • 相关阅读:
    高精度模板_C++
    NOIP总结
    HDU2063_过山车_C++
    手写堆_C++
    NOIP2013Day1解题报告
    [ CodeVS冲杯之路 ] P1368
    POJ1002_487-3279_C++
    [ CodeVS冲杯之路 ] P1092
    POJ2376_Cleaning Shifts_C++
    欧几里得距离_曼哈顿距离_切比雪夫距离
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4899238.html
Copyright © 2011-2022 走看看