CF1561D Up the Strip
Up the Strip
题意
你现在在 \(n\) 号格子,你需要跳到 \(1\) 号格子,你可以有两种跳法:
- 你可以做减法,即选择一个数 \(k\in [1,n)\) ,从 \(n\) 跳到 \(n-k\)
- 你可以做除法,即选择一个数 \(k\in(1,n]\),从 \(n\) 跳到 \(\lfloor\frac{n}{k}\rfloor\)
问你有多少种跳法,答案对给定模数取模。
题解
经典 \(dp\)。
很容易想到对做减法的部分求前缀和,对做除法的部分做整除分块。然而分块的复杂度是 \(\sqrt{n}\) 级别的,过不了 \(D2\) , 于是考虑优化。前缀和部分不能优化不了了,现优化整除分块。
经典套路:普通复杂度做法做不了就考虑算贡献。我们现在想知道,对于一个数 \(n\) ,他在除以 \(k\in(1,n]\) 里的数时,除出来的数分别出现了多少次。例如 \(10\) ,
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 10 |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 2 | 2 | 3 | 5 | 1 |
可以看到 \(1\) 出现了五次, \(2\) 出现了两次,\(3,5\) 分别出现了一次。我尝试用公式来表达,对于一个数 \(i\) ,他出现的次数为 \(\frac{n}{i}-\frac{n}{i+1}\)(易证)。于是 \(dp\) 的式子就可以写成
\]
第一部分可以用前缀和优化掉,第二部分怎么优化呢?单独考察 \(f_i\times \lfloor \frac{n}{i} \rfloor\) , 可以知道 \(n\) 只有在 \(i,2i,3i,...\) 的时候才会发生变化,于是我们考虑差分,开个数组 \(g\) 来存这个差分,更新到 \(f_i\) 时,我们就把 \(g_i,g_{2i},...\) 更新了。\(f_i\times \lfloor \frac{n}{i+1}\rfloor\) 同理。
AC代码
#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(NULL)
#define sc(z) scanf("%lld", &(z))
#define _ff(i, a, b) for (int i = a; i <= b; ++i)
#define _rr(i, a, b) for (int i = b; i >= a; --i)
#define _f(i, a, b) for (int i = a; i < b; ++i)
#define _r(i, a, b) for (int i = b - 1; i >= a; --i)
#define mkp make_pair
#define endl "\n"
#define pii pair<int,int>
#define fi first
#define se second
#define lowbit(x) x&(-x)
#define pb push_back
using namespace std;
typedef double db;
typedef long long ll;
typedef long double ld;
const int N = 4e6 + 5;
const ll M = 1e5 + 5;
const ll mod = 998244353;
const int inf = 1e9;
const double eps = 1e-9;
const double PI = acos(-1.0);
const pii NIL = {0,0};
ll f[N],g[N];
void solve() {
ll sum=0,sum2=0;f[1]=1;
ll n,p;cin>>n>>p;
_ff(i,1,n){
f[i]=(f[i]+((sum+sum2)%p+g[i])%p)%p;
for(int j=i;j<=n;j+=i)g[j]=(g[j]+f[i])%p;
for(int j=i+1;j<=n;j+=i+1)g[j]=(g[j]-f[i]+p)%p;
sum=(sum+f[i])%p;
sum2=(sum2+g[i])%p;
}
cout<<f[n]<<endl;
}
int main() {
IO;
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif // !ONLINE_JUDGE
// ll T; cin>>T;
// _f(i,0,T) {
// // cout<<"Case "<<i+1<<": ";
// solve();
// }
solve();
return 0;
}
CF1561D Up the Strip的更多相关文章
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- 4、Python:strip(),split()
1.strip()函数 strip()是删除'()'里面的字符,当()为空时,默认删除空白符(包括'\n','\r','\t','') (1)s.strip(rm) 删除s字符串中开头. ...
- Strip JS – 低侵入,响应式的 Lightbox 效果
Strip 是一个灯箱效果插件,显示的时候只会覆盖部分的页面,这使得侵扰程度较低,并留出了空间与页面上的大屏幕,同时给予小型移动设备上的经典灯箱体验.Strp JS 基于 jQuery 库实现,支持 ...
- strip的用法
函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头 ...
- python中strip,lstrip,rstrip简介
一.起因 今天在做角色控制中,有一个地方用到rstrip,判断用户请求的url是否与数据库对应可用权限中url相符. if request.path == x.url or request.path. ...
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
- pythong中字符串strip的用法
strip的用法是去除字符串中前后两端的xx字符,xx是一个字符数组,并不是去掉“”中的字符串, 数组中包含的字符都要在字符串中去除.默认去掉空格,lstrip则是去掉左边的,rstrip是右边的 见 ...
- Python strip函数用法小结
声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.lstrip(rm) 删除s字符串中开头处,位于 ...
- python strip() lstrip() rstrip() 使用方法
Python中的strip用于去除字符串的首尾字符串,同理,lstrip用于去除最左边的字符,rstrip用于去除最右边的字符. 这三个函数都可传入一个参数,指定要去除的首尾字符. 需要注意的是,传入 ...
- Linux Strip
一.简介 strip经常用来去除目标文件中的一些符号表.调试符号表信息,以减小程序的大小. 二.语法 https://sourceware.org/binutils/docs/binutils/str ...
随机推荐
- 找vector最大最小《转载》
定义了vector类型的数据,要找到其中的最大最小值,其实在C++中的algorithm头文件下就有直接的函数可以使用: #include <vector> #include <al ...
- yagmail 邮件模块
安装 yagmail 安装yagmail:https://coding.net/s/01e2c2fe-82c0-4e05-a31b-f3e9e2dbc43a 下载完成之后,cmd 切换到文件目录下,执 ...
- CCIE DC Multicast Part 4.
Hi Guys, Part 4 of my CCIE DC multicast article is presented below, in this article we are going to ...
- JavaScript基础知识整理(ES5创建对象)
创建对象 我们开始可以用Object构造函数或者对象字面量来快速创建对象,但使用这种方式创建多个对象时会产生大量重复代码,所以我们有了以下几种创建对象的方式. (1)工厂模式 function cre ...
- 大数据开源平台CDH 集群(CM6.3.1 + CDH 6.3.2)的部署
一,概述 我依照博文:https://www.cnblogs.com/liugp/p/16286645.html ,进行了CDH集群的部署.总体来说,基本比较顺利. 在部署过程中,发生了一些小问题.本 ...
- Android版本功能
Android 1.0 2008年9月23日,发布Android操作系统中的第一个正式版本:Android 1.0(Astro"铁臂阿童木").全球第一台Android设备HTC ...
- temp_laijx_2023
############################ [{\"itemKey\": \"jenkinsConfig\",\"itemValue\& ...
- uniapp引入腾讯云直播助手插件
在uniapp开发小程序,引入腾讯云直播助手插件 1.在manifest.json文件中,找到微信小程序特有相关,声明要使用的插件 /* 小程序特有相关 */ "mp-weixin" ...
- 学习-自增id++的问题
代码示例: let id = 0 const todos = ref([ { id: id++, text: 'Learn HTML' }, { id: id++, text: 'Lear ...
- 在Mac的哪里可以找到bashrc文件