Solution -「多校联训」朝鲜时蔬
Link.
破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面。
对于整数集 ,定义其 好子集 为满足 的任意 。求 的所有 阶子集中,包含 阶 好子集 数量最多的子集数。答案模 。
,。
令 表示一组 的答案,讨论之。
-
显然 。
-
设子集为 ,,则应有 。所以 。
-
显然 。
-
必然有 为最优集合,即 。
证明
- 考虑集合 ,$x -
设子集 ,,则应有 。枚举 ,得到
-
显然 。
-
这个结论不太好正向推出啊。总之,当 ,最优集合 的形式必为以下一种:
加之边界讨论,最终有
证明
对于最优的 ,$a2x>1x=2y\in\{3,4,5\}z,w\square$ -
可以打表, 我们喜闻乐见地得到神奇结论:
证明
构造最优的 ,应有 设 ,知 。类似讨论可证。 -
这个总算能阳间推导了 qwq。
对于 ,必然 。枚举 ,记 表示把 拆成 的方案数,不难发现
答案则为
整除分块即可。
-
显然 。
放三道傻瓜题的原因是让选手享受这题一个情况 分的快乐吗?(
/*~Rainybunny~*/
// Have you MODULED correctly?
#ifndef RYBY
#pragma GCC optimize( "Ofast" )
#endif
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
const int MOD = 1e9 + 7, INV2 = 500000004, INV3 = 333333336, INV4 = 250000002;
LL n;
int m, k;
inline LL sqrs( const LL x ) {
return x % MOD * ( ( x + 1 ) % MOD ) % MOD * ( ( 2 * x + 1 ) % MOD ) % MOD
* INV2 % MOD * INV3 % MOD;
}
inline void solve11() {
printf( "%lld\n", n % MOD );
}
inline void solve21() {
LL ans = 0;
for ( LL l = 1, r; l <= n; l = r + 1 ) {
r = n / ( n / l );
ans = ( ans + ( r - l + 1 ) % MOD
* ( ( n / l - 1 ) % MOD ) % MOD ) % MOD;
}
printf( "%lld\n", ans );
}
inline void solve22() {
printf( "%lld\n", n % MOD * ( ( n - 1 ) % MOD ) % MOD * INV2 % MOD );
}
inline void solve31() {
printf( "%lld\n", n / 3 % MOD );
}
inline void solve32() {
LL ans = 0;
for ( LL l = 1, r; l <= n; l = r + 1 ) {
r = n / ( n / l );
if ( l + ( l & 1 ) <= r - ( r & 1 ) ) { // even.
LL s = l + ( l & 1 ) - 1 >> 1, t = r - ( r & 1 ) - 1 >> 1;
LL c = ( r - ( r & 1 ) - ( l + ( l & 1 ) ) >> 1 ) + 1;
ans = ( ans + n / l % MOD * ( ( s + t ) % MOD ) % MOD
* ( c % MOD ) % MOD * INV2 % MOD ) % MOD;
}
if ( l + !( l & 1 ) <= r - !( r & 1 ) ) { // odd.
LL s = l + !( l & 1 ) - 1 >> 1, t = r - !( r & 1 ) - 1 >> 1;
LL c = ( r - !( r & 1 ) - ( l + !( l & 1 ) ) >> 1 ) + 1;
ans = ( ans + n / l % MOD * ( ( s + t ) % MOD ) % MOD
* ( c % MOD ) % MOD * INV2 % MOD ) % MOD;
}
}
printf( "%lld\n", ans );
}
inline void solve33() {
printf( "%lld\n", n % MOD * ( ( n - 1 ) % MOD ) % MOD
* ( ( n - 2 ) % MOD ) % MOD * INV2 % MOD * INV3 % MOD );
}
inline void solve41() {
if ( n <= 5 ) return void( puts( "1" ) );
printf( "%lld\n", ( n / 6 + n / 9 + n / 10
+ n / 12 + n / 15 + n / 21 ) % MOD );
}
inline void solve42() {
static const int SMA[] = { 1, 1, 1, 3, 6, 9, 10 };
if ( n <= 10 ) return void( printf( "%d\n", SMA[n - 4] ) );
printf( "%lld\n", ( ( n / 11 ) + ( n / 29 ) ) % MOD );
}
inline void solve43() {
if ( n == 4 ) return void( puts( "1" ) );
if ( n == 5 ) return void( printf( "%lld\n", n % MOD ) );
LL ans = 0; // (-MOD,MOD) !!!
for ( LL l = 6, r; l <= n; l = r + 1 ) {
r = n / ( n / l );
LL a = ( sqrs( r - 1 ) - sqrs( l - 2 ) ) % MOD;
LL b = ( l + r - 2 ) % MOD
* ( ( r - l + 1 ) % MOD ) % MOD * INV2 % MOD;
LL c = 0;
if ( l + ( l & 1 ) <= r - ( r & 1 ) ) { // even.
LL s = l + ( l & 1 ) >> 1, t = r - ( r & 1 ) >> 1;
LL k = ( r - ( r & 1 ) - ( l + ( l & 1 ) ) >> 1 ) + 1;
c = ( c + ( s + t ) % MOD * ( k % MOD ) % MOD * INV2 % MOD ) % MOD;
}
if ( l + !( l & 1 ) <= r - !( r & 1 ) ) { // odd.
LL s = l + !( l & 1 ) + 1 >> 1, t = r - !( r & 1 ) + 1 >> 1;
LL k = ( r - !( r & 1 ) - ( l + !( l & 1 ) ) >> 1 ) + 1;
c = ( c + ( s + t ) % MOD * ( k % MOD ) % MOD * INV2 % MOD ) % MOD;
}
ans = ( ans + ( n / l ) % MOD * ( ( a - b ) % MOD * INV2 % MOD
- ( 3 * c ) % MOD + 3 * ( r - l + 1 ) % MOD
+ 2 * ( r / 3 - ( l - 1 ) / 3 ) % MOD ) % MOD
* INV2 % MOD * INV3 % MOD ) % MOD;
}
printf( "%lld\n", ( ans % MOD + MOD ) % MOD );
}
inline void solve44() {
printf( "%lld\n", n % MOD * ( ( n - 1 ) % MOD ) % MOD
* ( ( n - 2 ) % MOD ) % MOD * ( ( n - 3 ) % MOD ) % MOD
* INV2 % MOD * INV3 % MOD * INV4 % MOD );
}
int main() {
freopen( "vegetable.in", "r", stdin );
freopen( "vegetable.out", "w", stdout );
scanf( "%lld %d %d", &n, &m, &k );
if ( m == 1 ) return solve11(), 0;
if ( m == 2 ) {
if ( k == 1 ) return solve21(), 0;
if ( k == 2 ) return solve22(), 0;
}
if ( m == 3 ) {
if ( k == 1 ) return solve31(), 0;
if ( k == 2 ) return solve32(), 0;
if ( k == 3 ) return solve33(), 0;
}
if ( m == 4 ) {
if ( k == 1 ) return solve41(), 0;
if ( k == 2 ) return solve42(), 0;
if ( k == 3 ) return solve43(), 0;
if ( k == 4 ) return solve44(), 0;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-10-07 Solution -「LOCAL」客星璀璨之夜
2020-10-07 Solution -「LOCAL」割海成路之日