[NowCoder5673E]Enigmatic Partition
题意
定义整数nnn的拆分n=a1+a2+...+amn=a_1+a_2+...+a_mn=a1+a2+...+am为"enigmatic partition"为符合以下条件的拆分:
- ai∈Za_i\in Zai∈Z且1≤ai≤n1\le a_i\le n1≤ai≤n。
- ai≤ai+1≤ai+1a_i\le a_{i+1}\le a_i+1ai≤ai+1≤ai+1
- am=a1+2a_m=a_1+2am=a1+2
设f(n)f(n)f(n)表示nnn有多少种不同的"enigmatic partition",求∑i=lrf(i)\displaystyle\sum_{i=l}^rf(i)i=l∑rf(i).
1≤l≤r≤1051\le l\le r\le10^51≤l≤r≤105
写在前面
考场上对mmm分类打表归纳出了f(n)f(n)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;
}
nnn | 111 | 222 | 333 | 444 | 555 | 666 | 777 | 888 | 999 | 101010 | 111111 | 121212 | 131313 | 141414 | 151515 | 161616 | 171717 | 181818 | 191919 | 202020 | 212121 | 222222 | 232323 | 242424 | 252525 | 262626 | 272727 | 282828 | 292929 | 303030 | 313131 | 323232 | 333333 | 343434 | 353535 | 363636 | 373737 | 383838 | 393939 | 404040 | 414141 | 424242 | 434343 | 444444 | 454545 | 464646 | 474747 | 484848 | 494949 | 505050 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
f(n)f(n)f(n) | 000 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 444 | 444 | 666 | 999 | 101010 | 111111 | 171717 | 171717 | 212121 | 242424 | 282828 | 313131 | 383838 | 373737 | 454545 | 505050 | 565656 | 565656 | 686868 | 696969 | 787878 | 838383 | 919191 | 949494 | 107107107 | 106106106 | 122122122 | 126126126 | 136136136 | 137137137 | 155155155 | 158158158 | 171171171 | 176176176 | 190190190 | 193193193 | 214214214 | 211211211 | 231231231 | 238238238 | 254254254 | 256256256 |
粗略地看只有f(2k+1)f(2k+1)f(2k+1)和f(2k+2)f(2k+2)f(2k+2)相差较小,但和f(2k)f(2k)f(2k)相差较大的规律。
通过简易分析,可知当m=n−2,n−3m=n-2,n-3m=n−2,n−3且n≥8n\ge8n≥8时一定只有一种方案;当m=n−4m=n-4m=n−4且n≥9n\ge9n≥9时只有两种方案。
考虑对不同的mmm进行分类打表:
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 | 000 | |||||||||||||||||||||||||||||||||||||||||||||||||
2 | 000 | 000 | ||||||||||||||||||||||||||||||||||||||||||||||||
3 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||||||||||||||
4 | 000 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||||||||||||||
5 | 000 | 000 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||||||||||||
6 | 000 | 000 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||||||||||||
7 | 000 | 000 | 000 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||||||||||
8 | 000 | 000 | 000 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||||||||||
9 | 000 | 000 | 111 | 111 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||||||||
10 | 000 | 000 | 000 | 000 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||||||||
11 | 000 | 000 | 000 | 111 | 111 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||||||
12 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||||||
13 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||||
14 | 000 | 000 | 000 | 000 | 111 | 111 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||||
15 | 000 | 000 | 111 | 111 | 222 | 222 | 222 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||||
16 | 000 | 000 | 000 | 111 | 111 | 111 | 222 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||||
17 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||||
18 | 000 | 000 | 111 | 000 | 111 | 222 | 222 | 222 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||||
19 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||||
20 | 000 | 000 | 000 | 111 | 222 | 111 | 222 | 222 | 333 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||||
21 | 000 | 000 | 111 | 111 | 111 | 222 | 333 | 333 | 333 | 444 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||||
22 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||||
23 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||||
24 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 333 | 333 | 333 | 444 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||||
25 | 000 | 000 | 000 | 111 | 222 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||||
26 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||||
27 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 333 | 444 | 444 | 444 | 555 | 555 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||||
28 | 000 | 000 | 000 | 111 | 111 | 111 | 333 | 222 | 333 | 333 | 444 | 444 | 555 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||||
29 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||||
30 | 000 | 000 | 111 | 000 | 222 | 222 | 222 | 222 | 333 | 444 | 444 | 444 | 555 | 555 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||||
31 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||||
32 | 000 | 000 | 000 | 111 | 111 | 111 | 222 | 333 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||||
33 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 555 | 555 | 555 | 666 | 666 | 777 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||||
34 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||||
35 | 000 | 000 | 000 | 111 | 222 | 222 | 333 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||||
36 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 222 | 444 | 333 | 444 | 555 | 555 | 555 | 666 | 666 | 777 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||||
37 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||||
38 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||||
39 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 666 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||||
40 | 000 | 000 | 000 | 111 | 222 | 111 | 222 | 333 | 333 | 444 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||||
41 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||||
42 | 000 | 000 | 111 | 000 | 111 | 222 | 333 | 222 | 333 | 333 | 444 | 444 | 555 | 666 | 666 | 666 | 777 | 777 | 888 | 888 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||||
43 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 999 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||||
44 | 000 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 333 | 333 | 555 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||||
45 | 000 | 000 | 111 | 111 | 222 | 222 | 222 | 333 | 444 | 444 | 444 | 555 | 555 | 666 | 777 | 777 | 777 | 888 | 888 | 999 | 999 | 101010 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||||
46 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 999 | 111111 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||||
47 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 999 | 101010 | 101010 | 111111 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |||
48 | 000 | 000 | 111 | 111 | 111 | 222 | 222 | 333 | 333 | 333 | 444 | 555 | 555 | 555 | 666 | 777 | 777 | 777 | 888 | 888 | 999 | 999 | 101010 | 111111 | 111111 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | ||
49 | 000 | 000 | 000 | 111 | 111 | 222 | 333 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 999 | 101010 | 101010 | 111111 | 111111 | 111111 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 | |
50 | 000 | 000 | 000 | 000 | 222 | 111 | 222 | 222 | 333 | 444 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 999 | 999 | 101010 | 101010 | 121212 | 111111 | 111111 | 101010 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 |
可以看出非常明显的规律,特别的当m≥n2m\ge\frac n2m≥2n时,g[n][m]g[n][m]g[n][m]的值为确定的常数,且每到偶数行就会多出一个常数,归纳后结果为⌊n−24⌋\lfloor\frac{n-2}4\rfloor⌊4n−2⌋。
当m<n2m<\frac n2m<2n时,继续观察可以发现:
- m=2k+3m=2k+3m=2k+3时,这一列几乎全是kkk,会出现少数k+1k+1k+1。
- m=2k+4m=2k+4m=2k+4时,这一列几乎全是kkk和k+1k+1k+1交替出现,少量kkk会变成k+1k+1k+1
事出反常必有妖,观察这些反常的k+1k+1k+1出现的规律,可以总结得到
- m=2k+3m=2k+3m=2k+3时,反常的k+1k+1k+1出现在2k+32k+32k+3的倍数行,即mmm的倍数行。
- m=2k+4m=2k+4m=2k+4时,反常的k+1k+1k+1出现在2k+42k+42k+4的倍数行,即mmm的倍数行。
大胆猜测,f(n)f(n)f(n)的值与其约数个数d(n)d(n)d(n)有关。
任取111行,对比其将反常的数修正前后的g[n][m]g[n][m]g[n][m],得到:
424242 | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
修正前 | 000 | 000 | 111 | 000 | 111 | 222 | 333 | 222 | 333 | 333 | 444 | 444 | 555 | 666 | 666 | 666 | 777 | 777 | 888 | 888 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 |
修正后 | 000 | 000 | 000 | 000 | 111 | 111 | 222 | 222 | 333 | 333 | 444 | 444 | 555 | 555 | 666 | 666 | 777 | 777 | 888 | 888 | 101010 | 999 | 999 | 888 | 888 | 777 | 777 | 666 | 666 | 555 | 555 | 444 | 444 | 333 | 333 | 222 | 222 | 111 | 111 | 000 | 000 | 000 |
可以发现所有nnn的大于222,小于n2\frac n22n的约数列都出现了反常的k+1k+1k+1。
总结一下前面的规律可以得到
f(n)−f(n−1)=两行反常的k+1出现次数差+常数\displaystyle f(n)-f(n-1)=\text{两行反常的k+1出现次数差}+\text{常数} f(n)−f(n−1)=两行反常的k+1出现次数差+常数
而每行反常的k+1k+1k+1出现次数又与d(n)d(n)d(n)有关,通过进一步观察发现次数差恰好等于d(n)−d(n−1)d(n)-d(n-1)d(n)−d(n−1)。
回到最初的表格,算出h(n)=f(n)−f(n−1)−[d(n)−d(n−1)]h(n)=f(n)-f(n-1)-[d(n)-d(n-1)]h(n)=f(n)−f(n−1)−[d(n)−d(n−1)]
nnn | 111 | 222 | 333 | 444 | 555 | 666 | 777 | 888 | 999 | 101010 | 111111 | 121212 | 131313 | 141414 | 151515 | 161616 | 171717 | 181818 | 191919 | 202020 | 212121 | 222222 | 232323 | 242424 | 252525 | 262626 | 272727 | 282828 | 292929 | 303030 | 313131 | 323232 | 333333 | 343434 | 353535 | 363636 | 373737 | 383838 | 393939 | 404040 | 414141 | 424242 | 434343 | 444444 | 454545 | 464646 | 474747 | 484848 | 494949 | 505050 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
h(n)h(n)h(n) | −1-1−1 | −1-1−1 | 000 | −1-1−1 | 111 | −1-1−1 | 222 | −1-1−1 | 333 | −1-1−1 | 444 | −1-1−1 | 555 | −1-1−1 | 666 | −1-1−1 | 777 | −1-1−1 | 888 | −1-1−1 | 999 | −1-1−1 | 101010 | −1-1−1 | 111111 | −1-1−1 | 121212 | −1-1−1 | 131313 | −1-1−1 | 141414 | −1-1−1 | 151515 | −1-1−1 | 161616 | −1-1−1 | 171717 | −1-1−1 | 181818 | −1-1−1 | 191919 | −1-1−1 | 202020 | −1-1−1 | 212121 | −1-1−1 | 222222 | −1-1−1 | 232323 | −1-1−1 |
归纳得
h(n)={−1,2∣nn−32,2∤nh(n)=\left\{\begin{aligned} &-1,&2\mid n\\ &\frac{n-3}2,&2\nmid n \end{aligned}\right. h(n)=⎩⎨⎧−1,2n−3,2∣n2∤n
用累加法可以求得
f(n)−f(1)−[d(n)−d(1)]=∑i=2nh(i)={−2k+(k−1)(k−2)2,n=2k+1−2k−1+(k−1)(k−2)2,n=2k+2f(n)-f(1)-[d(n)-d(1)]=\sum_{i=2}^nh(i)=\left\{\begin{aligned} &-2k+\frac{(k-1)(k-2)}2,&n=2k+1\\ &-2k-1+\frac{(k-1)(k-2)}2,&n=2k+2 \end{aligned}\right. 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=⌊n−12⌋k=\lfloor\frac{n-1}2\rfloork=⌊2n−1⌋,化简可得
f(n)=d(n)+12⌊n−12⌋2−32⌊n−12⌋−12[3+(−1)n]f(n)=d(n)+\frac12\lfloor\frac{n-1}2\rfloor^2-\frac32\lfloor\frac{n-1}2\rfloor-\frac12[3+(-1)^n] f(n)=d(n)+21⌊2n−1⌋2−23⌊2n−1⌋−21[3+(−1)n]
记s(n)=∑i=1nf(i)\displaystyle s(n)=\sum_{i=1}^nf(i)s(n)=i=1∑nf(i),令k=⌊n−12⌋k=\lfloor\frac{n-1}2\rfloork=⌊2n−1⌋,当n=2k+1n=2k+1n=2k+1时,有
s(n)=f(2k+1)+∑i=0k−1[f(2i+1)+f(2i+2)]=∑i=1nd(i)+12(k2−3k−2)+∑i=0k−1(i2−3i−3)=∑i=1nd(i)+12(k2−3k−2)+∑i=1k−1i2−3∑i=1k−1i−3k\begin{aligned} s(n)&=f(2k+1)+\sum_{i=0}^{k-1}[f(2i+1)+f(2i+2)]\\ &=\sum_{i=1}^nd(i)+\frac12(k^2-3k-2)+\sum_{i=0}^{k-1}(i^2-3i-3)\\ &=\sum_{i=1}^nd(i)+\frac12(k^2-3k-2)+\sum_{i=1}^{k-1}i^2-3\sum_{i=1}^{k-1}i-3k \end{aligned} 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+2n=2k+2n=2k+2时
s(n)=∑i=1nd(i)+∑i=1ki2−3∑i=1ki−3(k+1)s(n)=\sum_{i=1}^nd(i)+\sum_{i=1}^{k}i^2-3\sum_{i=1}^{k}i-3(k+1) s(n)=i=1∑nd(i)+i=1∑ki2−3i=1∑ki−3(k+1)
其中∑i=1nd(i)=∑i=1n⌊ni⌋\displaystyle\sum_{i=1}^nd(i)=\sum_{i=1}^n\lfloor\frac ni\rfloori=1∑nd(i)=i=1∑n⌊in⌋可以根号分块处理,∑i=1ki2\displaystyle\sum_{i=1}^ki^2i=1∑ki2和∑i=1ki\displaystyle\sum_{i=1}^kii=1∑ki可以用求和公式O(1)O(1)O(1)处理,故单次询问的复杂度为O(n)O(\sqrt n)O(n)。
算法一:线性筛+递推
时间复杂度O(n+T)O(n+T)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)O(T\sqrt n)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+ka_m=a_1+kam=a1+k,对mmm分类打出来的表找依旧很有规律,稍微总结一下应该也能做。
[NowCoder5673E]Enigmatic Partition相关推荐
- 2020暑期牛客多校训练营第八场(E)Enigmatic Partition(数学,二阶隔项差分)
Enigmatic Partition 原题请看这里 题目描述: 数字nnn的分区是所有数字之和等于nnn的集合. 如果分区n=a1+a2+...+amn = a_1 + a_2 + ... + a_ ...
- 【2020年牛客暑假第八场】E题 Enigmatic Partition
[2020年牛客暑假第八场]E题 Enigmatic Partition 一阶差分+隔项差分 题意 思路 方法一 方法二 Code 反思 题目链接: https://ac.nowcoder.com/a ...
- 2020牛客暑期多校训练营Enigmatic Partition(数学,二阶隔项差分)
Enigmatic Partition 题目描述 输入描述: 输出描述: 示例1 输入 3 5 7 7 9 1 9 输出 Case #1: 2 Case #2: 7 Case #3: 8 说明 题目大 ...
- 牛客多校8 - Enigmatic Partition(二阶差分)
题目链接:点击查看 题目大意:首先定义 " n 的拆分 " 是 n = a[ 1 ] + a[ 2 ] + ... + a[ m ] ,在本题中,n 的拆分需要满足几个条件: a[ ...
- 2020牛客暑期多校训练营(第八场) Enigmatic Partition
原题 题目描述 样例 输入 3 5 7 7 9 1 9 输出 Case #1: 2 Case #2: 7 Case #3: 8 说明 f(1)=0. f(2)=0. f(3)=0. f(4)=0. f ...
- 牛客多校第八场 Enigmatic Partition(DP)
思路: 只看懂了题解的写法,还有一种差分的神仙写法实在看不懂. 因为每个数字是由三个连续数字构成,然后数目不确定,所以我们枚举第一个数字l,那么就知道这三个数字是l,l+1,l+2. 我们枚举l的数目 ...
- E Enigmatic Partition 2020牛客暑期多校训练营(第八场)
https://ac.nowcoder.com/acm/contest/5673/E 设我们要算出f[1-n],那么枚举a,a+1,a+2的个数,要满足x*a+(a+1)*y+(a+2)*z=1-n的 ...
- 2020牛客暑期多校训练营(第八场)E.Enigmatic Partition(差分+隔项差分/dp+暴力)
题目 n的m划分是把n划分成m个数之和,令,要求满足: ,, 计f(n)为n的满足上述限制的划分数, T(T<=1e4)组询问,每次给出l,r(1<=l<=r<=1e5),询问 ...
- 2020牛客暑期多校训练营(第八场)E Enigmatic Partition —— 找规律,差分上差分,有丶东西
This way 题意: 定义合法序列: n=a1+a2+-+am(m的大小是你自己构造的&m>=3),并且满足以下条件 定义f(n)为构造n的合法序列的情况数,然后每次问你n为l~r中 ...
- 2020牛客暑期多校训练营(第八场)Enigmatic Partition
题目链接 https://ac.nowcoder.com/acm/contest/5673/E 题目大意 将数 x 拆分,需要满足拆分的数的最大和最小的差值为2,且相邻两个数的差值不能超过1 定义 f ...
最新文章
- ubuntu和windows系统双系统的开机选项界面有很多无关选项
- TRzCheckTree的使用
- CentOS7下搭建Nextcloud13.0.5
- java保持运行_保持Java程序无限运行的方法是有效的吗?
- bzoj2957 奥妙重重的线段树
- linux原理 培训,Linux容器技术原理和使用
- Artifact到底是什么
- python输出print(x+y)_Python语句序列“x='car';y=2;print(x+y)”的输出结果是() (2.0分)_学小易找答案...
- Guava学习笔记(1)--安全地使用null(Using and avoiding null)
- springboot与docker整合
- 乳化液稳定剂php,乳化液稳定剂PHP对小于0.1mm煤泥浮选的影响
- webpack 了解
- vs 自动生成core dump文件
- 基于几何学习图像的三维重建发展_基于深度学习的三维重建——MVSNet系列论文解读...
- mysql vc运行库_VC++运行库安装
- 这几个小工具也太好用了
- JAVA Applet——绘制心形曲线
- 【Javascript】【视频录制】通过video标签和canvas实现视频截图录制和下载
- 市面上主流编辑器介绍(2021/05/20)
- USB Type-C 转音频+快充方案简介
热门文章
- 专升本第七部分 计算机网络基础与网页设计
- Amazon软件开发工程师面试题
- Windows常见基本进程八:wuauclt
- 【Win7快速清理痕迹】
- linux是基于什么的开源操作系统,什么是开源操作系统
- 史上最简单的word文档docx文档解密方法,忘记word文档docx密码怎么办?
- 数字计算机如何分类 依据是什么,计算机如何分类?
- signature=e7411d00c74ac359f20083a015dc6ea9,MS12-020:遠端桌面的弱點可能會允許遠端程式碼執行:2012 年 3 月 13 日...
- 零基础玩转树莓派(六)—遥控小车
- nginx 区分手机浏览器和pc浏览器