HDOJ 4651 整数拆分

来源:互联网 发布:很红的网络翻唱歌曲 编辑:程序博客网 时间:2024/05/16 18:27

这题显然是数学题,整数拆分问题,要用到五边形定理。

其中,f(n)=求和((-1)^(k-1)*f(n-k*(3*k-1)/2))+求和((-1)^(k-1)*f(n-k*(3*k+1)/2)),其中保证k>=1,且n-k*(3*k-1)/2>=0,n-k*(3*k+1)/2>=0, 并且f(0)=1。

关于如何推出这个公式的,我就不清楚了。

#include <iostream>#include <fstream>#include <algorithm>#include <cstring>using namespace std;#define N 100000#define T 1000000007long long p[N+5];int main(){    freopen("1.in","r",stdin);    freopen("1.out","w",stdout);    p[0] = p[1] =1;    for (int i=2;i<=N;i++){        int k=1;        int flag=1;        while ((k*(3*k-1))/2<=i){            p[i]+=flag*p[i-(k*(3*k-1))/2];            if (p[i]>=T) p[i]%=T;            if (p[i]<0) p[i]+=T;            flag*=-1;            k++;        }        k= flag = 1;        while ((k*(3*k+1))/2<=i){            p[i]+=flag*p[i-(k*(3*k+1))/2];            if (p[i]>=T) p[i]%=T;            if (p[i]<0) p[i]+=T;            flag*=-1;            k++;        }       // cout<<p[i]<<',';    }    int n;    cin>>n;    for (int i=0;i<n;i++){        int j;        scanf("%d",&j);        printf("%d\n",p[j]);    }    return 0;}


原创粉丝点击