邝斌的ACM模板(整数拆分)

来源:互联网 发布:华军软件下载 编辑:程序博客网 时间:2024/06/06 03:53

本博客整理自邝斌的ACM模板
2.11、 整数拆分
HDU 4651

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 main(){    int T;    int n;    init();    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        printf("%d\n",dp[n]);    }    return 0;}

HDU 4658
数 n(<=10^5)的划分,相同的数重复不能超过 k 个。

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;    int n,k;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&k);        printf("%d\n",solve(n,k));    }    return 0;}
原创粉丝点击