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

朝鲜时蔬

  • 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+(n≥1),定义其和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(1≤m≤n)阶子集集合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)={T∣∣∣​T={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(1≤k≤n)级价值子集集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)={T∣∣∣​k=sum(T)sum(S)​∧k∈N+}⋂Sk​(S)

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

定义其m(1≤m≤n)m(1\le m\le n)m(1≤m≤n)阶k(1≤k≤m)k(1\le k\le m)k(1≤k≤m)级价值函数为其所有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)∣∣∣∣​T∈Sm​(S)}

定义其m(1≤m≤n)m(1\le m\le n)m(1≤m≤n)阶k(1≤k≤m)k(1\le k\le m)k(1≤k≤m)级价值函数的值点集合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)={T∣∣∣​∣Tk​(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}1≤n≤1012

子任务编号分值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)x2​∤x1​⇒x2​∤(x1​+x2​),(显然较大值不会是较小值的因数,不可能整除)

所以只可能有x1∣x2⇒x1∣(x1+x2)x_1\mid x_2\Rightarrow x_1\mid(x_1+x_2)x1​∣x2​⇒x1​∣(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​=k∗i,k∈[2,⌊in​⌋],即有⌊ni⌋−2+1=⌊ni⌋−1\lfloor\frac{n}{i}\rfloor-2+1=\lfloor\frac{n}{i}\rfloor-1⌊in​⌋−2+1=⌊in​⌋−1

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

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} ⎩⎪⎨⎪⎧​z∗x1​=x1​+x2​+x3​y∗x2​=x1​+x2​+x3​x∗x3​=x1​+x2​+x3​​⇒⎩⎪⎨⎪⎧​x1​+x2​+x3​x1​​=z1​x1​+x2​+x3​x2​​=y1​x1​+x2​+x3​x3​​=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​<x3​⇒x<3⇒x=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+z​⇒2(y+z)−yz=0⇒(y−2)(z−2)=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 ⎩⎪⎨⎪⎧​6∗x1​=x1​+x2​+x3​3∗x2​=x1​+x2​+x3​2∗x3​=x1​+x2​+x3​​⇒6x1​=3x2​=2x3​
令k=x1⇒x2=2k,x3=3kk=x_1\Rightarrow x_2=2k,x_3=3kk=x1​⇒x2​=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),k∈N+,在n≥3n\ge 3n≥3时存在

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

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

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​=i−1,则x2=1x_2=1x2​=1;…\dots… ;如果x1=1x_1=1x1​=1,则x2=i−1x_2=i-1x2​=i−1,一定有i−1i-1i−1种拆分方法

但是集合{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=1∑n​⌊in​⌋2i−1−[2∣i]​

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​<x4​→1>x1​1​>x2​1​>x3​1​>x4​1​,满足
{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​=w∗x1​x1​+x2​+x3​+x4​=z∗x2​x1​+x2​+x3​+x4​=y∗x3​x1​+x2​+x3​+x4​=x∗x4​​
则,有1x1+1x2+1x3+1x4=1\frac{1}{x_1}+\frac{1}{x_2}+\frac{1}{x_3}+\frac{1}{x_4}=1x1​1​+x2​1​+x3​1​+x4​1​=1

假设x≥3x\ge 3x≥3,则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}<1x1​1​+x2​1​+x3​1​+x4​1​≤31​+41​+51​+61​<1

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

假设y≥6y\ge 6y≥6,则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}x2​1​+x3​1​+x4​1​≤61​+71​+81​<21​

假设矛盾,所以2<y<6⇒y=2/3/42<y<6\Rightarrow y=2/3/42<y<6⇒y=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)(z−6)(w−6)=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)(z−4)(w−4)=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(3z−10)(3w−10)=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 6n≥6的时候才会全都成立,当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,5⌊6n​⌋+⌊9n​⌋+⌊10n​⌋+⌊12n​⌋+⌊15n​⌋+⌊21n​⌋n≥6​

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​+x3​−x1​<3(x1​+x3​)

所以1<s<3⇒s=21<s<3\Rightarrow s=21<s<3⇒s=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​=5x2​−7x1​<5(x1​+x2​)

所以2=s<t<5⇒t=3/42=s<t<5\Rightarrow t=3/42=s<t<5⇒t=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 11n≥11时,满足假设条件,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=10⌊11n​⌋+⌊29n​n≥11​

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-in−i,再计算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,...i−2,则x2=[1,i−2],...,[1,1]x_2=[1,i-2],...,[1,1]x2​=[1,i−2],...,[1,1]

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

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

显然,a+a+ba+a+ba+a+b的形式能被计算到,当且仅当a∈[1,⌊i−12⌋]a\in [1,\lfloor\frac{i-1}{2}\rfloor]a∈[1,⌊2i−1​⌋]。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}\rfloor−3⌊2i−1​⌋,将这个暴力拆开与上面的合并,则会发现iii为偶数的时候,多减了32\frac{3}{2}23​,要加回来

但这样a+a+aa+a+aa+a+a形式就会被减去三次,多减了两次,需要加回来2[3∣i]2[3|i]2[3∣i](别忘了这个形式存在的前提是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=5∑i=1n​⌊in​⌋12i2−6i+5+3[2∣i]+4[3∣i]​n≥6​
但是又因为涉及分块,所以计算一段区间内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.tpcf.cn/news/316947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…