题意
定义整数
n的拆分
n=a1+a2+...+am为"enigmatic partition"为符合以下条件的拆分:
-
ai∈Z且
1≤ai≤n。
-
ai≤ai+1≤ai+1
-
am=a1+2
设
f(n)表示
n有多少种不同的"enigmatic partition",求
i=l∑rf(i).
1≤l≤r≤105
写在前面
考场上对
m分类打表归纳出了
f(n)的数学表达式,但是不知道如何用数学证明,如果有大佬知道怎么证明请联系一下我,谢谢。
题解
首先可以写一个爆搜
#include<bits/stdc++.h>
using namespace std;
const int N=100+5;
int n,a[N],f[N];
void dfs(int m,int res){
if(res<0)return;
if(res==0){
--m;
if(a[m]==a[1]+2)++f[n];
return;
}
a[m]=a[m-1];
dfs(m+1,res-a[m]);
if(a[m-1]<=a[1]+1){
a[m]=a[m-1]+1;
dfs(m+1,res-a[m]);
}
}
int main(){
for(n=1;n<=50;++n){
for(int i=1;i<=n;++i)
a[1]=i,
dfs(2,n-i);
}
for(n=1;n<=50;++n)
printf("%2d:%3d\n",n,f[n]);
return 0;
}
n |
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 |
f(n) |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
4 |
4 |
6 |
9 |
10 |
11 |
17 |
17 |
21 |
24 |
28 |
31 |
38 |
37 |
45 |
50 |
56 |
56 |
68 |
69 |
78 |
83 |
91 |
94 |
107 |
106 |
122 |
126 |
136 |
137 |
155 |
158 |
171 |
176 |
190 |
193 |
214 |
211 |
231 |
238 |
254 |
256 |
粗略地看只有
f(2k+1)和
f(2k+2)相差较小,但和
f(2k)相差较大的规律。
通过简易分析,可知当
m=n−2,n−3且
n≥8时一定只有一种方案;当
m=n−4且
n≥9时只有两种方案。
考虑对不同的
m进行分类打表:
int g[N][N];
void dfs(int m,int res){
...
if(res==0){
--m;
if(a[m]==a[1]+2)
++g[n][m];
return;
}
...
}
int main(){
...
for(n=1;n<=50;++n){
printf("%2d:",n);
for(int m=1;m<=n;++m)
printf("%3d ",g[n][m]);
puts("");
}
...
}
得到如下表格
|
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 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
0 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
0 |
0 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
0 |
0 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
0 |
0 |
0 |
0 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
0 |
0 |
0 |
1 |
1 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
0 |
0 |
0 |
0 |
1 |
1 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
0 |
0 |
1 |
1 |
2 |
2 |
2 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
0 |
0 |
0 |
1 |
1 |
1 |
2 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
0 |
0 |
1 |
0 |
1 |
2 |
2 |
2 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
0 |
0 |
0 |
1 |
2 |
1 |
2 |
2 |
3 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
0 |
0 |
1 |
1 |
1 |
2 |
3 |
3 |
3 |
4 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
3 |
4 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
0 |
0 |
0 |
1 |
2 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
4 |
4 |
4 |
5 |
5 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
0 |
0 |
0 |
1 |
1 |
1 |
3 |
2 |
3 |
3 |
4 |
4 |
5 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
0 |
0 |
1 |
0 |
2 |
2 |
2 |
2 |
3 |
4 |
4 |
4 |
5 |
5 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
0 |
0 |
0 |
1 |
1 |
1 |
2 |
3 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
5 |
5 |
5 |
6 |
6 |
7 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
0 |
0 |
0 |
1 |
2 |
2 |
3 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
2 |
4 |
3 |
4 |
5 |
5 |
5 |
6 |
6 |
7 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
39 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
6 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
40 |
0 |
0 |
0 |
1 |
2 |
1 |
2 |
3 |
3 |
4 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
41 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
42 |
0 |
0 |
1 |
0 |
1 |
2 |
3 |
2 |
3 |
3 |
4 |
4 |
5 |
6 |
6 |
6 |
7 |
7 |
8 |
8 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
43 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
44 |
0 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
5 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
45 |
0 |
0 |
1 |
1 |
2 |
2 |
2 |
3 |
4 |
4 |
4 |
5 |
5 |
6 |
7 |
7 |
7 |
8 |
8 |
9 |
9 |
10 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
46 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
11 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
47 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
10 |
10 |
11 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
|
48 |
0 |
0 |
1 |
1 |
1 |
2 |
2 |
3 |
3 |
3 |
4 |
5 |
5 |
5 |
6 |
7 |
7 |
7 |
8 |
8 |
9 |
9 |
10 |
11 |
11 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
|
49 |
0 |
0 |
0 |
1 |
1 |
2 |
3 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
10 |
10 |
11 |
11 |
11 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
|
50 |
0 |
0 |
0 |
0 |
2 |
1 |
2 |
2 |
3 |
4 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
9 |
9 |
10 |
10 |
12 |
11 |
11 |
10 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
可以看出非常明显的规律,特别的当
m≥2n时,
g[n][m]的值为确定的常数,且每到偶数行就会多出一个常数,归纳后结果为
⌊4n−2⌋。
当
m<2n时,继续观察可以发现:
-
m=2k+3时,这一列几乎全是
k,会出现少数
k+1。
-
m=2k+4时,这一列几乎全是
k和
k+1交替出现,少量
k会变成
k+1
事出反常必有妖,观察这些反常的
k+1出现的规律,可以总结得到
-
m=2k+3时,反常的
k+1出现在
2k+3的倍数行,即
m的倍数行。
-
m=2k+4时,反常的
k+1出现在
2k+4的倍数行,即
m的倍数行。
大胆猜测,
f(n)的值与其约数个数
d(n)有关。
任取
1行,对比其将反常的数修正前后的
g[n][m],得到:
42 |
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 |
修正前 |
0 |
0 |
1 |
0 |
1 |
2 |
3 |
2 |
3 |
3 |
4 |
4 |
5 |
6 |
6 |
6 |
7 |
7 |
8 |
8 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
修正后 |
0 |
0 |
0 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
8 |
8 |
10 |
9 |
9 |
8 |
8 |
7 |
7 |
6 |
6 |
5 |
5 |
4 |
4 |
3 |
3 |
2 |
2 |
1 |
1 |
0 |
0 |
0 |
可以发现所有
n的大于
2,小于
2n的约数列都出现了反常的
k+1。
总结一下前面的规律可以得到
f(n)−f(n−1)=两行反常的k+1出现次数差+常数
而每行反常的
k+1出现次数又与
d(n)有关,通过进一步观察发现次数差恰好等于
d(n)−d(n−1)。
回到最初的表格,算出
h(n)=f(n)−f(n−1)−[d(n)−d(n−1)]
n |
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 |
h(n) |
−1 |
−1 |
0 |
−1 |
1 |
−1 |
2 |
−1 |
3 |
−1 |
4 |
−1 |
5 |
−1 |
6 |
−1 |
7 |
−1 |
8 |
−1 |
9 |
−1 |
10 |
−1 |
11 |
−1 |
12 |
−1 |
13 |
−1 |
14 |
−1 |
15 |
−1 |
16 |
−1 |
17 |
−1 |
18 |
−1 |
19 |
−1 |
20 |
−1 |
21 |
−1 |
22 |
−1 |
23 |
−1 |
归纳得
h(n)=⎩⎨⎧−1,2n−3,2∣n2∤n
用累加法可以求得
f(n)−f(1)−[d(n)−d(1)]=i=2∑nh(i)=⎩⎪⎪⎨⎪⎪⎧−2k+2(k−1)(k−2),−2k−1+2(k−1)(k−2),n=2k+1n=2k+2
其中
k=⌊2n−1⌋,化简可得
f(n)=d(n)+21⌊2n−1⌋2−23⌊2n−1⌋−21[3+(−1)n]
记
s(n)=i=1∑nf(i),令
k=⌊2n−1⌋,当
n=2k+1时,有
s(n)=f(2k+1)+i=0∑k−1[f(2i+1)+f(2i+2)]=i=1∑nd(i)+21(k2−3k−2)+i=0∑k−1(i2−3i−3)=i=1∑nd(i)+21(k2−3k−2)+i=1∑k−1i2−3i=1∑k−1i−3k
同理,当
n=2k+2时
s(n)=i=1∑nd(i)+i=1∑ki2−3i=1∑ki−3(k+1)
其中
i=1∑nd(i)=i=1∑n⌊in⌋可以根号分块处理,
i=1∑ki2和
i=1∑ki可以用求和公式
O(1)处理,故单次询问的复杂度为
O(n
)。
算法一:线性筛+递推
时间复杂度
O(n+T)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
int is[N], pr[N], d[N], c[N];
ll f[N], s[N];
int main() {
int n = 1e5;
d[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!is[i])
pr[++pr[0]] = i, d[i] = 2, c[i] = 1;
for (int j = 1, x; j <= pr[0] && (x = i * pr[j]) <= n; ++j) {
is[x] = 1;
if (i % pr[j])
c[x] = 1, d[x] = d[i] << 1;
else {
c[x] = c[i] + 1, d[x] = d[i] / c[x] * (c[x] + 1);
break;
}
}
}
for (int i = 1; i <= n; ++i)
f[i] = f[i - 1] + d[i] - d[i - 1] + (i & 1 ? (i - 3) / 2 : -1),
s[i] = s[i - 1] + f[i];
scanf("%*d");
for (int i = 1, l, r; ~scanf("%d%d", &l, &r); ++i)
printf("Case #%d: %lld\n", i, s[r] - s[l - 1]);
return 0;
}
算法二:根号分块
时间复杂度
O(Tn
)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll s1(int n) { return (ll)n * (n + 1) >> 1; }
inline ll s2(int n) { return (ll)n * (n + 1) * (n << 1 | 1) / 6; }
inline ll s(int n) {
if (!n)
return 0;
int k = (n - 1) / 2, f = n & 1;
ll Sum = n & 1 ? ((ll)k * (k - 3) - 2) >> 1 : 0ll;
for (int i = 1, j; i <= n; i = j + 1) {
j = n / (n / i);
Sum += (ll)(n / i) * (j - i + 1);
}
Sum += s2(k - f) - 3 * s1(k - f) - 3 * (k + 1 - f);
return Sum;
}
int main() {
scanf("%*d");
for (int i = 1, l, r; ~scanf("%d%d", &l, &r); ++i)
printf("Case #%d: %lld\n", i, s(r) - s(l - 1));
return 0;
}
后记
赛后发现,把此题扩展到
am=a1+k,对
m分类打出来的表找依旧很有规律,稍微总结一下应该也能做。