hdu

题意

整数拆分,$(1le nle 10^5)$

题解

使用五边形定理

其中 ,注意两个条件要分开判断,有大于0的就加上相应的f,不是两个同时成立或者不成立

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#define forl(i, l, r) for (int i = l; i <= r; i++)
#define forr(i, r, l) for (int i = r; i >= l; i--)
#define for1(i, n) for (int i = 1; i <= n; i++)
#define for0(i, n) for (int i = 0; i < n; i++)
#define meminf(a) memset(a, inf, sizeof(a))
#define mem_1(a) memset(a, -1, sizeof(a))
#define mem0(a) memset(a, 0, sizeof(a))
#define inlld(lld) scanf("%lld",&lld)
typedef unsigned long long ull;
#define inlf(f) scanf("%lf",&f)
#define ind(d) scanf("%d",&d)
#define ins(s) scanf("%s",s)
#define inf 0x3f3f3f3f
typedef long long ll;
#define pi acos(-1.0)
#define mod (int)(1e9+7)
#define N (int)(1.1e5)
using namespace std;
int p[N];
int () {
#ifndef ONLINE_JUDGE

// freopen("/Users/perpeternal/Documents/Sketch/data/out.dat","w",stdout);
#endif
//ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
p[0]=1;
for1(i,100005){
ll fl=1,an=0,flag=1;
while(1){
ll tmp=fl*(3*fl-1)/2;
if(i-tmp<0)break;
an=(an+flag*p[i-tmp]+mod)%mod;
tmp=fl*(3*fl+1)/2;
if(i-tmp<0)break;
an=(an+flag*p[i-tmp]+mod)%mod;
fl++;
flag*=-1;
}
p[i]=an;
// printf("%dn",tmp);
}
int t,n;
ind(t);
while(t--){
ind(n);
printf("%dn",p[n]);
}
return 0;
}