朝鲜时蔬(分数据点写算法+毒瘤数学)

朝鲜时蔬

  • decription
  • solution
  • code

decription

对于一个有穷非空正整数集合S={x1,x2,x3,...,xn}⊂N+(n≥1)S=\{x_1,x_2,x_3,...,x_n\}\subset N^+(n\ge 1)S={x1,x2,x3,...,xn}N+(n1),定义其和sum(S)sum(S)sum(S)为所有元素的和

  • sum(S)=x1+...+xnsum(S)=x_1+...+x_nsum(S)=x1+...+xn

定义其m(1≤m≤n)m(1\le m\le n)m(1mn)阶子集集合Sm(S)\mathfrak{S}_m(S)Sm(S)为其所有mmm阶子集的集合

  • Sm(S)={T∣T={y1,…,ym}⊆S}\mathfrak{S}_m(S)=\Big\{T\Big|T=\{y_1,\dots,y_m\}\subseteq S\Big\}Sm(S)={TT={y1,,ym}S}

TTT就是从SSS中选mmm个不同数的组成的一个子集,Sm(S)\mathfrak{S}_m(S)Sm(S)就是子集TTT所有情况的集合

定义其k(1≤k≤n)k(1\le k\le n)k(1kn)级价值子集集Tk(S)\mathfrak{T}_k(S)Tk(S)为其所有kkk阶子集中和整除sum(S)sum(S)sum(S)

  • Tk(S)={T∣k=sum(S)sum(T)∧k∈N+}⋂Sk(S)\mathfrak{T}_k(S)=\Big\{T\Big|k=\frac{sum(S)}{sum(T)}\wedge k\in N^+\Big\}\bigcap\mathfrak{S}_k(S)Tk(S)={Tk=sum(T)sum(S)kN+}Sk(S)

就是满足上一个要求的基础上,子集元素和能整除原来的大集合的子集的集合

定义其m(1≤m≤n)m(1\le m\le n)m(1mn)k(1≤k≤m)k(1\le k\le m)k(1km)级价值函数为其所有mmm阶子集中kkk级价值子集集的阶的最大值

  • fm,k(S)=max⁡{∣Tk(T)∣∣T∈Sm(S)}f_{m,k}(S)=\max\Big\{|\mathfrak{T}_{k}(T)|\quad\Big|\quad T\in\mathfrak{S}_m(S)\Big\}fm,k(S)=max{Tk(T)TSm(S)}

定义其m(1≤m≤n)m(1\le m\le n)m(1mn)k(1≤k≤m)k(1\le k\le m)k(1km)级价值函数的值点集合Pm,k(S)\mathfrak{P}_{m,k}(S)Pm,k(S)为取到上述最大值的mmm阶子集的集合

  • Pm,k(S)={T∣∣Tk(T)∣=fm,k(S)}⋂Sm(S)\mathfrak{P}_{m,k}(S)=\Big\{T\quad\Big|\quad |\mathfrak{T}_k(T)|=f_{m,k}(S)\Big\}\bigcap\mathfrak{S}_m(S)Pm,k(S)={TTk(T)=fm,k(S)}Sm(S)

给出n,m,kn,m,kn,m,k,表示集合S=1,2,...,nS={1,2,...,n}S=1,2,...,n

∣Pm,k(S)∣|\mathfrak{P}_{m,k}(S)|Pm,k(S),即有多少个mmm阶子集能取到最大值,答案对109+710^9+7109+7取模

1≤n≤10121\le n\le 10^{12}1n1012

子任务编号分值m=k=
11011
21021
31022
41031
51032
61033
71041
81042
91043
101044

solution

这种分数据点写不同算法的题真的很不错,如果不那么绕弯子就更好了!

有些点直接写吐了,giao

实际上,上面的四种定义,从后往前看其实很像递归的感觉,而我们就需要在这种递归思想中找到答案的规律!(证明也行)

倒着看,实际上是最开始的集合S={1,2,...,n}S=\{1,2,...,n\}S={1,2,...,n},从中选mmm个定义为子集T={x1,...,xm}T=\{x_1,...,x_m\}T={x1,...,xm},再从TTT中选kkk个定义为子子集PPP


m=k

显然只要从SSS中选出mmm个后,TTT中选kkk个组成的PPP,一定满足sum(T)=sum(P)sum(T)=sum(P)sum(T)=sum(P)

所以答案就是从nnn个中选mmm个的方案数
C(n,m)C(n,m)C(n,m)

void subtask1() {int ans = 1;for( int i = n;i > n - m;i -- )ans = i % mod * ans % mod;for( int i = 1;i <= m;i ++ )ans = ans * qkpow( i, mod - 2 ) % mod;printf( "%lld\n", ans );
}

m=2,k=1

不妨假设正整数x1<x2x_1<x_2x1<x2

由于x2∤x1⇒x2∤(x1+x2)x_2\nmid x_1\Rightarrow x_2\nmid(x_1+x_2)x2x1x2(x1+x2),(显然较大值不会是较小值的因数,不可能整除)

所以只可能有x1∣x2⇒x1∣(x1+x2)x_1\mid x_2\Rightarrow x_1\mid(x_1+x_2)x1x2x1(x1+x2)

枚举x1=ix_1=ix1=i,则x2=k∗i,k∈[2,⌊ni⌋]x_2=k*i,k\in[2,\lfloor\frac{n}{i}\rfloor]x2=ki,k[2,in],即有⌊ni⌋−2+1=⌊ni⌋−1\lfloor\frac{n}{i}\rfloor-2+1=\lfloor\frac{n}{i}\rfloor-1in2+1=in1

答案为∑i=1n(⌊ni⌋−1)\sum_{i=1}^n(\lfloor\frac{n}{i}\rfloor-1)i=1n(in1)
按照⌊ni⌋\lfloor\frac{n}{i}\rfloorin分块,连续一段区间[l,r][l,r][l,r]⌊ni⌋\lfloor\frac{n}{i}\rfloorin相同

void subtask2() {int ans = 0;for( int r = n, l;r > 0;r = l - 1 ) {if( r == 1 ) break;l = n / ( n / r + 1 ) + 1;int t = n / r;ans = ( ans + t % mod * ( r - l + 1 ) % mod ) % mod;}printf( "%lld\n", ans );
}

m=3,k=1

假设nnn足够大且存在x1<x2<x3x_1<x_2<x_3x1<x2<x3满足
{x1∣(x1+x2+x3)x2∣(x1+x2+x3)x3∣(x1+x2+x3)\begin{cases} x_1\mid (x_1+x_2+x_3)\\ x_2\mid (x_1+x_2+x_3)\\ x_3\mid (x_1+x_2+x_3) \end{cases} x1(x1+x2+x3)x2(x1+x2+x3)x3(x1+x2+x3)
不失一般性假设正整数1<x<y<z1<x<y<z1<x<y<z,即1>1x>1y>1z1>\frac{1}{x}>\frac{1}{y}>\frac{1}{z}1>x1>y1>z1

满足
{z∗x1=x1+x2+x3y∗x2=x1+x2+x3x∗x3=x1+x2+x3⇒{x1x1+x2+x3=1zx2x1+x2+x3=1yx3x1+x2+x3=1x\begin{cases} z*x_1 = x_1+x_2+x_3\\ y*x_2 = x_1+x_2+x_3\\ x*x_3 = x_1+x_2+x_3 \end{cases}\\ \Rightarrow \begin{cases} \frac{x_1}{x_1+x_2+x_3}=\frac{1}{z}\\ \frac{x_2}{x_1+x_2+x_3}=\frac{1}{y}\\ \frac{x_3}{x_1+x_2+x_3}=\frac{1}{x}\\ \end{cases} zx1=x1+x2+x3yx2=x1+x2+x3xx3=x1+x2+x3x1+x2+x3x1=z1x1+x2+x3x2=y1x1+x2+x3x3=x1
则有1x+1y+1z=1\frac{1}{x}+\frac{1}{y}+\frac{1}{z}=1x1+y1+z1=1,且1=1x+1y+1z<3x⇒x<3⇒x=21=\frac{1}{x}+\frac{1}{y}+\frac{1}{z}<\frac{3}{x}\Rightarrow x<3\Rightarrow x=21=x1+y1+z1<x3x<3x=2

因此1y+1z=12=y+zyz⇒2(y+z)−yz=0⇒(y−2)(z−2)=4\frac{1}{y}+\frac{1}{z}=\frac{1}{2}=\frac{y+z}{yz}\Rightarrow 2(y+z)-yz=0\Rightarrow (y-2)(z-2)=4y1+z1=21=yzy+z2(y+z)yz=0(y2)(z2)=4

从而解出了唯一解x=2,y=3,z=6x=2,y=3,z=6x=2,y=3,z=6

于是,有
{6∗x1=x1+x2+x33∗x2=x1+x2+x32∗x3=x1+x2+x3⇒6x1=3x2=2x3\begin{cases} 6*x_1 = x_1+x_2+x_3\\ 3*x_2 = x_1+x_2+x_3\\ 2*x_3 = x_1+x_2+x_3 \end{cases}\\ \Rightarrow 6x_1=3x_2=2x_3 6x1=x1+x2+x33x2=x1+x2+x32x3=x1+x2+x36x1=3x2=2x3
k=x1⇒x2=2k,x3=3kk=x_1\Rightarrow x_2=2k,x_3=3kk=x1x2=2k,x3=3k

所以(x1,x2,x3)=(k,2k,3k),k∈N+(x_1,x_2,x_3)=(k,2k,3k),k\in N^+(x1,x2,x3)=(k,2k,3k),kN+,在n≥3n\ge 3n3时存在

要满足x1,x2,x3≤nx_1,x_2,x_3\le nx1,x2,x3n,所以kkk的取值范围为[1,⌊n3⌋][1,\lfloor\frac{n}{3}\rfloor][1,3n]

答案为⌊n3⌋\lfloor\frac{n}{3}\rfloor3n

void subtask3() {printf( "%lld\n", ( n / 3 ) % mod );	
}

m=3,k=2

不妨假设正整数x1<x2<x3x_1<x_2<x_3x1<x2<x3

因为
{(x1+x3)∤x2⇒(x1+x3)∤(x1+x2+x3)(x2+x3)∤x1⇒(x2+x3)∤(x1+x2+x3)\begin{cases} (x_1+x_3)\nmid x_2\Rightarrow (x_1+x_3)\nmid(x_1+x_2+x_3)\\ (x_2+x_3)\nmid x_1\Rightarrow (x_2+x_3)\nmid(x_1+x_2+x_3) \end{cases} {(x1+x3)x2(x1+x3)(x1+x2+x3)(x2+x3)x1(x2+x3)(x1+x2+x3)
所以只可能有(x1+x2)∣x3⇒(x1+x2)∣(x1+x2+x3)(x_1+x_2)\mid x_3\Rightarrow (x_1+x_2)\mid(x_1+x_2+x_3)(x1+x2)x3(x1+x2)(x1+x2+x3)

尝试枚举x1+x2=ix_1+x_2=ix1+x2=i,得到x3x_3x3的取值个数(与m=2,k-1的求法一样)

再求出iii拆分成x1+x2x_1+x_2x1+x2的拆分方案,利用乘法原理求得最后答案

枚举x1x_1x1后(实际上不可能在代码里枚举)便可唯一确定x2x_2x2的取值

对于和为iii而言:如果x1=i−1x_1=i-1x1=i1,则x2=1x_2=1x2=1…\dots ;如果x1=1x_1=1x1=1,则x2=i−1x_2=i-1x2=i1,一定有i−1i-1i1种拆分方法

但是集合{2,3}\{2,3\}{2,3}和集合{3,2}\{3,2\}{3,2}是没有区别的,所以形如a+ba+ba+b的拆分被算了两次,且不合法的形如a+aa+aa+a的拆分也被算了一次

先减去不合法的a+aa+aa+a形式拆分(如果存在的话,显然这种拆分存在当且仅当iii为偶数)

再除以二就是a+ba+ba+b形式的拆分个数了

同样的,我们需要分块来做

答案为∑i=1n⌊ni⌋i−1−[2∣i]2\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\frac{i-1-[2|i]}{2}i=1nin2i1[2i]

void subtask6() {
/*
(i-1-[2|i])/2
通过打表发现
1->0
2->0
3->1
4->1
...
所以如果是奇数 就是/2
如果是偶数 那么就是/2-1
相当于是两组等差数列
注意l开局的奇偶即可
*/int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );int c = 0;//x首相 y项数 因为有两组所以不用/2了if( l & 1 ) {int len = r - l + 1;int x = l / 2 % mod;int y = len / 2 % mod;c = ( c + ( x + x + y - 1 ) % mod * y % mod ) % mod;if( len & 1 ) c = ( c + r / 2 ) % mod;}else {int x = l / 2 - 1;c = ( c + x % mod ) % mod;int len = r - l;int y = len / 2 % mod;x ++;c = ( c + ( x + x + y - 1 ) % mod * y % mod ) % mod;if( len & 1 ) c = ( c + r / 2 ) % mod;}ans = ( ans + n / r % mod * c % mod ) % mod;}printf( "%lld\n", ( ans + mod ) % mod );
}

m=4,k=1

假设nnn足够大且存在x1<x2<x3<x4→1>1x1>1x2>1x3>1x4x_1<x_2<x_3<x_4\rightarrow 1>\frac{1}{x_1}>\frac{1}{x_2}>\frac{1}{x_3}>\frac{1}{x_4}x1<x2<x3<x41>x11>x21>x31>x41,满足
{x1∣(x1+x2+x3+x4)x2∣(x1+x2+x3+x4)x3∣(x1+x2+x3+x4)x4∣(x1+x2+x3+x4)\begin{cases} x_1|(x_1+x_2+x_3+x_4)\\ x_2|(x_1+x_2+x_3+x_4)\\ x_3|(x_1+x_2+x_3+x_4)\\ x_4|(x_1+x_2+x_3+x_4) \end{cases} x1(x1+x2+x3+x4)x2(x1+x2+x3+x4)x3(x1+x2+x3+x4)x4(x1+x2+x3+x4)
不失一般性地假设x<y<z<wx<y<z<wx<y<z<w,满足
{x1+x2+x3+x4=w∗x1x1+x2+x3+x4=z∗x2x1+x2+x3+x4=y∗x3x1+x2+x3+x4=x∗x4\begin{cases} x_1+x_2+x_3+x_4=w*x_1\\ x_1+x_2+x_3+x_4=z*x_2\\ x_1+x_2+x_3+x_4=y*x_3\\ x_1+x_2+x_3+x_4=x*x_4 \end{cases} x1+x2+x3+x4=wx1x1+x2+x3+x4=zx2x1+x2+x3+x4=yx3x1+x2+x3+x4=xx4
则,有1x1+1x2+1x3+1x4=1\frac{1}{x_1}+\frac{1}{x_2}+\frac{1}{x_3}+\frac{1}{x_4}=1x11+x21+x31+x41=1

假设x≥3x\ge 3x3,则1x1+1x2+1x3+1x4≤13+14+15+16<1\frac{1}{x_1}+\frac{1}{x_2}+\frac{1}{x_3}+\frac{1}{x_4}\le \frac{1}{3}+\frac{1}{4}+\frac{1}{5}+\frac{1}{6}<1x11+x21+x31+x4131+41+51+61<1

假设矛盾,所以1<x<3⇒x=21<x<3\Rightarrow x=21<x<3x=2

假设y≥6y\ge 6y6,则1x2+1x3+1x4≤16+17+18<12\frac{1}{x_2}+\frac{1}{x_3}+\frac{1}{x_4}\le \frac{1}{6}+\frac{1}{7}+\frac{1}{8}<\frac{1}{2}x21+x31+x4161+71+81<21

假设矛盾,所以2<y<6⇒y=2/3/42<y<6\Rightarrow y=2/3/42<y<6y=2/3/4

  • y=3y=3y=3,有(z−6)(w−6)=36→(2,3,7,42);(2,3,8,24);(2,3,9,18);(2,3,10,15)(z-6)(w-6)=36\rightarrow (2,3,7,42);(2,3,8,24);(2,3,9,18);(2,3,10,15)(z6)(w6)=36(2,3,7,42);(2,3,8,24);(2,3,9,18);(2,3,10,15)
  • y=4y=4y=4,有(z−4)(w−4)=16→(2,3,5,20);(2,4,6,12)(z-4)(w-4)=16\rightarrow(2,3,5,20);(2,4,6,12)(z4)(w4)=16(2,3,5,20);(2,4,6,12)
  • y=5y=5y=5,有(3z−10)(3w−10)=100→∅(3z-10)(3w-10)=100\rightarrow \empty(3z10)(3w10)=100

所以整理一下,结果为

(x1,x2,x3,x4)=(k,2k,3k,6k);;(k,2k,6k,9k);;(k,3k,8k,12k);;(k,4k,5k,10k);;(k,6k,14k,21k);;(2k,3k,10k,15k)(x_1,x_2,x_3,x_4)=(k,2k,3k,6k);;(k,2k,6k,9k);;(k,3k,8k,12k);;(k,4k,5k,10k);;(k,6k,14k,21k);;(2k,3k,10k,15k)(x1,x2,x3,x4)=(k,2k,3k,6k);;(k,2k,6k,9k);;(k,3k,8k,12k);;(k,4k,5k,10k);;(k,6k,14k,21k);;(2k,3k,10k,15k)

(反解过程,上面有示范,这里不再展开计算)

所以在n≥6n\ge 6n6的时候才会全都成立,当n=4/5n=4/5n=4/5就手玩硬算

答案为
{1n=4,5⌊n6⌋+⌊n9⌋+⌊n10⌋+⌊n12⌋+⌊n15⌋+⌊n21⌋n≥6\begin{cases} 1\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\ n=4,5\\ \lfloor\frac{n}{6}\rfloor+\lfloor\frac{n}{9}\rfloor+\lfloor\frac{n}{10}\rfloor+\lfloor\frac{n}{12}\rfloor+\lfloor\frac{n}{15}\rfloor+\lfloor\frac{n}{21}\rfloor\quad n\ge 6 \end{cases} {1 n=4,56n+9n+10n+12n+15n+21nn6

void subtask4() {if( n == 4 or n == 5 ) printf( "1\n" );else printf( "%lld\n", ( n / 6 % mod + n / 9 % mod + n / 10 % mod + n / 12 % mod + n / 15 % mod + n / 21 % mod ) % mod );
}

m=4,k=2

不妨假设正整数x1<x2<x3<x4x_1<x_2<x_3<x_4x1<x2<x3<x4,则有
{(x2+x4)∤(x1+x3)⇒(x2+x4)∤(x1+x2+x3+x4)(x3+x4)∤(x1+x2)⇒(x3+x4)∤(x1+x2+x3+x4)\begin{cases} (x_2+x_4)\nmid(x_1+x_3)\Rightarrow (x_2+x_4)\nmid(x_1+x_2+x_3+x_4)\\ (x_3+x_4)\nmid(x_1+x_2)\Rightarrow (x_3+x_4)\nmid(x_1+x_2+x_3+x_4) \end{cases} {(x2+x4)(x1+x3)(x2+x4)(x1+x2+x3+x4)(x3+x4)(x1+x2)(x3+x4)(x1+x2+x3+x4)
假设nnn足够大且存在x1<x2<x3<x4x_1<x_2<x_3<x_4x1<x2<x3<x4,满足
{(x1+x2)∣(x1+x2+x3+x4)⇒(x1+x2)∣(x3+x4)(x1+x3)∣(x1+x2+x3+x4)⇒(x1+x3)∣(x2+x4)(x1+x4)∣(x1+x2+x3+x4)⇒x1+x4=x2+x3(x2+x3)∣(x1+x2+x3+x4)⇒x1+x4=x2+x3\begin{cases} (x_1+x_2)\mid(x_1+x_2+x_3+x_4)\Rightarrow (x_1+x_2)\mid (x_3+x_4)\\ (x_1+x_3)\mid(x_1+x_2+x_3+x_4)\Rightarrow (x_1+x_3)\mid (x_2+x_4)\\ (x_1+x_4)\mid(x_1+x_2+x_3+x_4)\Rightarrow x_1+x_4=x_2+x_3\\ (x_2+x_3)\mid(x_1+x_2+x_3+x_4)\Rightarrow x_1+x_4=x_2+x_3\\ \end{cases} (x1+x2)(x1+x2+x3+x4)(x1+x2)(x3+x4)(x1+x3)(x1+x2+x3+x4)(x1+x3)(x2+x4)(x1+x4)(x1+x2+x3+x4)x1+x4=x2+x3(x2+x3)(x1+x2+x3+x4)x1+x4=x2+x3
因为x2<x3<x4x_2<x_3<x_4x2<x3<x4,所以x2+x4x_2+x_4x2+x4不可能大于等于x4x_4x4的三倍,只能是x4x_4x4的两倍多(毕竟x4x_4x4+x1+x_1+x1

s(x1+x3)=x2+x4=2x2+x3−x1<3(x1+x3)s(x_1+x_3)=x_2+x_4=2x_2+x_3-x_1<3(x_1+x_3)s(x1+x3)=x2+x4=2x2+x3x1<3(x1+x3)

所以1<s<3⇒s=21<s<3\Rightarrow s=21<s<3s=2

t(x1+x2)=x3+x4=5x2−7x1<5(x1+x2)t(x_1+x_2)=x_3+x_4=5x_2-7x_1<5(x_1+x_2)t(x1+x2)=x3+x4=5x27x1<5(x1+x2)

所以2=s<t<5⇒t=3/42=s<t<5\Rightarrow t=3/42=s<t<5t=3/4

推出(x1,x2,x3,x4)=(k,5k,7k,11k);;(k,11k,19k,20k)(x_1,x_2,x_3,x_4)=(k,5k,7k,11k);;(k,11k,19k,20k)(x1,x2,x3,x4)=(k,5k,7k,11k);;(k,11k,19k,20k)

n≥11n\ge 11n11时,满足假设条件,n<11n<11n<11的情况直接手玩
{1n=4,5,63n=76n=89n=910n=10⌊n11⌋+⌊n29n≥11\begin{cases} 1\quad\quad\quad\quad\quad\ n=4,5,6\\ 3\quad\quad\quad\quad\quad\ n=7\\ 6\quad\quad\quad\quad\quad\ n=8\\ 9\quad\quad\quad\quad\quad\ n=9\\ 10\quad\quad\quad\quad\ \ \ n=10\\ \lfloor\frac{n}{11}\rfloor+\lfloor\frac{n}{29}\quad n\ge 11 \end{cases} 1 n=4,5,63 n=76 n=89 n=910   n=1011n+29nn11

void subtask5() {if( n == 4 or n == 5 or n == 6 ) printf( "1\n" );else if( n == 7 ) printf( "3\n" );else if( n == 8 ) printf( "6\n" );else if( n == 9 ) printf( "9\n" );else if( n == 10 ) printf( "10\n" );else printf( "%lld\n", ( n / 11 % mod + n / 29 % mod ) % mod );
}

m=4,k=3

不妨假设正整数x1<x2<x3<x4x_1<x_2<x_3<x_4x1<x2<x3<x4,有
{(x1+x2+x4)∤x3⇒(x1+x2+x4)∤(x1+x2+x3+x4)(x1+x3+x4)∤x2⇒(x1+x3+x4)∤(x1+x2+x3+x4)(x3+x2+x4)∤x1⇒(x3+x2+x4)∤(x1+x2+x3+x4)\begin{cases} (x_1+x_2+x_4)\nmid x_3\Rightarrow (x_1+x_2+x_4)\nmid(x_1+x_2+x_3+x_4)\\ (x_1+x_3+x_4)\nmid x_2\Rightarrow (x_1+x_3+x_4)\nmid(x_1+x_2+x_3+x_4)\\ (x_3+x_2+x_4)\nmid x_1\Rightarrow (x_3+x_2+x_4)\nmid(x_1+x_2+x_3+x_4)\\ \end{cases} (x1+x2+x4)x3(x1+x2+x4)(x1+x2+x3+x4)(x1+x3+x4)x2(x1+x3+x4)(x1+x2+x3+x4)(x3+x2+x4)x1(x3+x2+x4)(x1+x2+x3+x4)
所以只可能有

(x1+x2+x3)∣x4⇒(x1+x2+x3)∣(x1+x2+x3+x4)(x_1+x_2+x_3)\mid x_4\Rightarrow (x_1+x_2+x_3)\mid(x_1+x_2+x_3+x_4)(x1+x2+x3)x4(x1+x2+x3)(x1+x2+x3+x4)

通过枚举i=x1+x2+x3i=x_1+x_2+x_3i=x1+x2+x3,确定x4x_4x4的个数n−in-ini,再计算iii拆分的方案,乘法原理即可求得最后答案

考虑计算拆分方案:假想枚举x1x_1x1,则a+b+ca+b+ca+b+c的形式会被计算666次,a+a+ba+a+ba+a+b的形式会被计算333次,a+a+aa+a+aa+a+a的形式会被计算111

x1=1,2,...i−2x_1=1,2,...i-2x1=1,2,...i2,则x2=[1,i−2],...,[1,1]x_2=[1,i-2],...,[1,1]x2=[1,i2],...,[1,1]

所以方案数为(i−2)+(i−1)+...+1=(i−1)(i−2)2(i-2)+(i-1)+...+1=\frac{(i-1)(i-2)}{2}(i2)+(i1)+...+1=2(i1)(i2)

我们如果能减去这些不合法的形式,再除以六就是拆分的最终方案数了

显然,a+a+ba+a+ba+a+b的形式能被计算到,当且仅当a∈[1,⌊i−12⌋]a\in [1,\lfloor\frac{i-1}{2}\rfloor]a[1,2i1]a+a+aa+a+aa+a+a的形式能被计算到,当且仅当i=3ai=3ai=3a

我们可以再假想枚举x2x_2x2,来减掉a+a+ba+a+ba+a+b的形式, 即−3⌊i−12⌋-3\lfloor\frac{i-1}{2}\rfloor32i1,将这个暴力拆开与上面的合并,则会发现iii为偶数的时候,多减了32\frac{3}{2}23,要加回来

但这样a+a+aa+a+aa+a+a形式就会被减去三次,多减了两次,需要加回来2[3∣i]2[3|i]2[3i](别忘了这个形式存在的前提是i=3ai=3ai=3a),这个的基础是最后总数/6/6/6,但是答案的表示是/12/12/12

所以上面分子写的是444的系数

所以答案是
{1n=45n=5∑i=1n⌊ni⌋i2−6i+5+3[2∣i]+4[3∣i]12n≥6\begin{cases} 1\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\ \ \ n=4\\ 5\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\ \ \ n=5\\ \sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\frac{i^2-6i+5+3[2|i]+4[3|i]}{12}\quad n\ge 6 \end{cases} 1   n=45   n=5i=1nin12i26i+5+3[2i]+4[3i]n6
但是又因为涉及分块,所以计算一段区间内2,32,32,3的倍数个数,简直要命,主要是左端点开头,救命!!

void subtask7() {if( n == 4 ) printf( "1\n" );else if( n == 5 ) printf( "5" );else {int ans = 0, lst = 0, inv2 = qkpow( 2, mod - 2 ), inv3 = qkpow( 3, mod - 2 ), inv12 = qkpow( 12, mod - 2 );for( int l = 1, r;l <= n;l = r + 1 ) {r = ( n / ( n / l ) );int len = r - l + 1;int now = r % mod * ( ( r + 1 ) % mod ) % mod * ( ( r % mod * 2 + 1 ) % mod ) % mod * inv2 % mod * inv3 % mod;int c = ( now - lst + mod ) % mod;c = ( c - ( l % mod + r % mod ) % mod * ( len % mod ) % mod * inv2 % mod * 6 % mod + mod ) % mod;c = ( c + len % mod * 5 % mod + mod ) % mod;lst = now;c = ( c + ( len / 2 % mod + ( len & 1 and ! ( l & 1 ) ) ) * 3 % mod ) % mod;c = ( c + ( len / 3 % mod + ( ( len % 3 != 0 ) and ( ( l % 3 == 0 ) or ( len % 3 == 2 and l % 3 == 2 ) ) ) ) * 4 % mod ) % mod;c = c * inv12 % mod;ans = ( ans + n / r % mod * c % mod ) % mod;}printf( "%lld\n", ans );}
}

code

#include <cstdio>
#include <cmath>
using namespace std;
#define mod 1000000007
#define int long long
int n, m, k;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void subtask1() {int ans = 1;for( int i = n;i > n - m;i -- )ans = i % mod * ans % mod;for( int i = 1;i <= m;i ++ )ans = ans * qkpow( i, mod - 2 ) % mod;printf( "%lld\n", ans );
}void subtask2() {int ans = 0;for( int r = n, l;r > 0;r = l - 1 ) {if( r == 1 ) break;l = n / ( n / r + 1 ) + 1;int t = n / r;ans = ( ans + t % mod * ( r - l + 1 ) % mod ) % mod;}printf( "%lld\n", ans );
}void subtask3() {printf( "%lld\n", ( n / 3 ) % mod );	
}void subtask4() {if( n == 4 or n == 5 ) printf( "1\n" );else printf( "%lld\n", ( n / 6 % mod + n / 9 % mod + n / 10 % mod + n / 12 % mod + n / 15 % mod + n / 21 % mod ) % mod );
}void subtask5() {if( n == 4 or n == 5 or n == 6 ) printf( "1\n" );else if( n == 7 ) printf( "3\n" );else if( n == 8 ) printf( "6\n" );else if( n == 9 ) printf( "9\n" );else if( n == 10 ) printf( "10\n" );else printf( "%lld\n", ( n / 11 % mod + n / 29 % mod ) % mod );
}void subtask6() {int ans = 0;for( int l = 1, r;l <= n;l = r + 1 ) {r = n / ( n / l );int c = 0;if( l & 1 ) {int len = r - l + 1;int x = l / 2 % mod;int y = len / 2 % mod;c = ( c + ( x + x + y - 1 ) % mod * y % mod ) % mod;if( len & 1 ) c = ( c + r / 2 ) % mod;}else {int x = l / 2 - 1;c = ( c + x % mod ) % mod;int len = r - l;int y = len / 2 % mod;x ++;c = ( c + ( x + x + y - 1 ) % mod * y % mod ) % mod;if( len & 1 ) c = ( c + r / 2 ) % mod;}ans = ( ans + n / r % mod * c % mod ) % mod;}printf( "%lld\n", ( ans + mod ) % mod );
}void subtask7() {if( n == 4 ) printf( "1\n" );else if( n == 5 ) printf( "5" );else {int ans = 0, lst = 0, inv2 = qkpow( 2, mod - 2 ), inv3 = qkpow( 3, mod - 2 ), inv12 = qkpow( 12, mod - 2 );for( int l = 1, r;l <= n;l = r + 1 ) {r = ( n / ( n / l ) );int len = r - l + 1;int now = r % mod * ( ( r + 1 ) % mod ) % mod * ( ( r % mod * 2 + 1 ) % mod ) % mod * inv2 % mod * inv3 % mod;int c = ( now - lst + mod ) % mod;c = ( c - ( l % mod + r % mod ) % mod * ( len % mod ) % mod * inv2 % mod * 6 % mod + mod ) % mod;c = ( c + len % mod * 5 % mod + mod ) % mod;lst = now;c = ( c + ( len / 2 % mod + ( len & 1 and ! ( l & 1 ) ) ) * 3 % mod ) % mod;c = ( c + ( len / 3 % mod + ( ( len % 3 != 0 ) and ( ( l % 3 == 0 ) or ( len % 3 == 2 and l % 3 == 2 ) ) ) ) * 4 % mod ) % mod;c = c * inv12 % mod;ans = ( ans + n / r % mod * c % mod ) % mod;}printf( "%lld\n", ans );}
}signed main() {freopen( "vegetable.in", "r", stdin );freopen( "vegetable.out", "w", stdout );scanf( "%lld %lld %lld", &n, &m, &k );if( m == k ) subtask1();else if( m == 2 and k == 1 ) subtask2();else if( m == 3 and k == 1 ) subtask3();else if( m == 4 and k == 1 ) subtask4();else if( m == 4 and k == 2 ) subtask5();else if( m == 3 and k == 2 ) subtask6();else subtask7();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P7515:矩阵游戏(差分约束)

解析 如果没有元素均要在 [0,1e6][0,1e6][0,1e6] 的条件&#xff0c;可以很容易的构造出一个合法解。 那么我们就要通过调整得到的解&#xff0c;使所有数都在合法范围内。 注意到&#xff0c;每次给某一行/列依次1,-1,1,-1…这样仍然符合要求。 让每一行/列错开&#xff0c;…

Recursive sequence HDU - 5950

Recursive sequence HDU - 5950 题意&#xff1a; 给你一个式子&#xff1a;f[n]2f[n-2]f[n-1]n4 给你f[1]和f[2]&#xff0c;给你一个n&#xff0c;求f[n] f[1],f[2],n<231 题解&#xff1a; 很明显&#xff0c;矩阵快速幂&#xff0c;但是太久没做这种题&#xff0c;我…

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

今天&#xff0c;Visual Studio中没有内置工具来测试WEB API。使用浏览器&#xff0c;只能测试http GET请求。您需要使用Postman&#xff0c;SoapUI&#xff0c;Fiddler或Swagger等第三方工具来执行WEB API的完整测试。在ASP.NET Core 2.2中&#xff0c;引入了一个名为“http-r…

洛谷P7518:宝石(倍增、可撤销并查集)

解析 算法一 定义 upx,kup_{x,k}upx,k​ 为节点 xxx 从自己的颜色所在位置在返祖链上往后跳 2k2^k2k 个颜色到达的节点。 可以像倍增一样的求解。 这样对于一次询问 (s,t)(s,t)(s,t) 我们就能求出 (s,lca)(s,lca)(s,lca) 这一段能取到哪里了。 对于向下的情况&#xff0c;再处…

E - Counting Cliques HDU - 5952

E - Counting Cliques HDU - 5952 题意&#xff1a; 给你n个点&#xff0c;m个边&#xff0c;还有一个s&#xff0c;问这个图中有多少个等于s的点集可以组成一个完全图 题解&#xff1a; 这题。。直接暴力搜索就行 分析复杂度的时候&#xff0c;应该考虑只有1000条边&#…

Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程&#xff0c;仅作探讨。不过由于篇幅有限&#xff0c;完整的DevOps&#xff0c;我们后续独立探讨。 为了降低容器的使用门槛以及便于大家将容器技…

2021牛客NOIP提高组第二场T2——方格计数(组合数计数)

方格计数descriptionsolutioncodedescription 在左下角是 (&#x1d7ce;, &#x1d7ce;)&#xff0c;右上角是 (W, H)的网格上&#xff0c;有 (W 1) (H 1) 个格点。 现在要在格点上找 N个不同的点&#xff0c;使得这些点在一条直线上。并且在这条直线上&#xff0c; 相邻…

Acwing 1085. 不要62

Acwing 1085. 不要62 题意&#xff1a; 问[n,m]这些数中有多少数不包含4&#xff0c;且不包含连续的62 题解&#xff1a; 经典数位dp&#xff0c;分析过程以前的数位dp博客有写 Acwing 1082. 数字游戏 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) …

ybtoj洛谷P4406三角形面积并(扫描线)

解析 暴力求出所有三角形之间的所有交点&#xff0c;提出所有的横坐标。 然后任意两个相邻的横坐标之间的面积都是若干个梯形。 那么就可以求出对于每一个横坐标截得的三角形长度的并的和&#xff0c;然后加在一起乘高除以二即可。 在这里插入代码片#include<bits/stdc.h&…

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

[NowCoder牛客]2021NOIP提高组模拟赛第二场T3——树数树(启发式合并堆)

树数树descriptionsolutioncodedescription 【题目描述】 牛牛有一棵 n 个点的有根树&#xff0c;根为 1。 我们称一个长度为 m 的序列 a 是好的&#xff0c;当且仅当&#xff1a; • ∀&#x1d456;∈(1,&#x1d45a;]∀&#x1d456;∈(1, &#x1d45a;]∀i∈(1,m]&#…

Acwing1086. 恨7不成妻(未解决)

Acwing1086. 恨7不成妻 题意&#xff1a; 问一个区间内与7无关的整数的平方和 与7有关包括&#xff1a; 1.整数中某一位是 7&#xff1b; 2.整数的每一位加起来的和是 7 的整数倍&#xff1b; 3.这个整数是 7 的整数倍。 题解&#xff1a; 数位dp&#xff0c;有点难。。 这…

模板:拓展kmp(Z函数)

所谓拓展kmp&#xff0c;就是拓展的kmp &#xff08;逃&#xff09; 前言 小清新算法&#xff0c;更像一个trick。 exkmp能够在线性复杂度内求出字符串所有后缀与字符串本身的lcp。 个人感觉这个东西和kmp关系不大&#xff0c;反而有些像马拉车的思想。 之前学的东西&#xf…

牛客NOIP2021提高组OI赛前模拟赛第一场T3——与巨(数学)

与巨descriptionsolutioncodedescription 【题目描述】 定义无穷序列f:f11,fnfn−1∗21f:f_11,f_nf_{n-1}*21f:f1​1,fn​fn−1​∗21 定义函数G(x)min⁡fi≥x(fi)G(x)\min_{f_i\ge x}(f_i)G(x)minfi​≥x​(fi​) 定义dpc,00,dpc,imax⁡(dpc,i−1,[((i∗c)&G(i))i]∗i)…

ASP.NET Core 自定义认证方式--请求头认证

Intro最近开始真正的实践了一些网关的东西&#xff0c;最近写几篇文章分享一下我的实践以及遇到的问题。本文主要介绍网关后面的服务如何进行认证。解决思路网关可以做一部分的认证和授权&#xff0c;服务内部有时候也会需要用户的信息&#xff0c;这时该怎么办呢&#xff0c;我…

2016ICPC沈阳站

2016ICPC沈阳站 题号题目知识点难度AThickest Burger贪心签到BRelative atomic mass贪心签到CRecursive sequence矩阵快速幂快铜DWinning an AuctionECounting Cliquesdfs剪枝稳铜快银FSimilar RotationsGDo not pour outHGuessing the Dice RollIThe ElderJQuery on a graphK…

P7516 [省选联考 2021 A/B 卷] 图函数

解析 纯纯的人类智慧题。 关键性质&#xff1a;vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献&#xff0c;当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互相到达。 充分性较为显然&#xff0c;编号更大的点不会比 vvv 先删去&#xff0c;所以必然在 vvv 时…

开发语言大爆炸的时代,究竟谁主沉浮?

开发语言大爆炸的时代&#xff0c;究竟谁主沉浮&#xff1f;当这个系列本来打算是写人物的&#xff0c;而且是写我们身边那些优秀的开发者&#xff0c;然而当第一篇文章&#xff0c;写的是关于我们长沙.NET社区的优秀开发者邹琼俊&#xff0c;发表在博客园之后&#xff0c;有一…

2021牛客NOIP提高组OI赛前模拟赛第一场T2——牛牛和数组操作(区间dp)

牛牛和数组操作descriptionsolutioncodedescription 【题目描述】 有n 2个整数a0, a1, . . . , an, an1&#xff0c; a0 an1 0。你需要做确切地n次操作&#xff0c;每次 操作为以下形式&#xff1a; 选择一个整数x满足ax ≠ 0&#xff0c;使得ax 0&#xff0c;令lmaxi<…

杜教BM模板(用于求线性递推公式第N项)

通过手动求出线性递推公式的前几项&#xff08;一般要前8项&#xff09;&#xff0c;杜教BM模板可以直接求第n项是多少。。我才知道&#xff0c;离谱。。对于我来说是妙计 //递推公式黑科技 #include<bits/stdc.h> using namespace std; ///#define X first //#define Y…