传送门

文章目录

  • 题意:
  • 思路

题意:

有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作:

(1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一个数yyy,跳到第x−yx-yx−y个细胞上。

(2)(2)(2)选择[2,x][2,x][2,x]之间的一个数zzz,跳到⌊xz⌋\left \lfloor \frac{x}{z} \right \rfloor⌊zx​⌋。

问你有多少种不同的方式到达111号细胞。

2≤n≤4e62\le n\le 4e62≤n≤4e6

思路

如果直接按照题意来设计状态,f[i]f[i]f[i]表示从nnn到iii的方案数,那么第一个操作显然可以用一个变量打一个标记,第二个可以整除分块,将iii这个点的贡献分配给⌊xz⌋\left \lfloor \frac{x}{z} \right \rfloor⌊zx​⌋。

复杂度O(nn)O(n\sqrt n)O(nn​)

这个只能通过简单版本,要通过这个题的话,显然需要优化,其实不难发现他与倍数有关。

我们考虑倒着来设计状态,f[i]f[i]f[i]表示从iii到111的方案数,那么f[1]=1f[1]=1f[1]=1。

假设当前枚举的点是kkk,考虑⌊xz⌋=k\left \lfloor \frac{x}{z} \right \rfloor=k⌊zx​⌋=k这个式子,代表从xxx点能到当前点kkk,由于我们是倒着来的,那么也就是kkk这个点可以转移到xxx,考虑枚举zzz,那么能转移到的区间就是[k∗z,k∗z+z−1][k*z,k*z+z-1][k∗z,k∗z+z−1],通过枚举倍数让后打一个标记即可。

复杂度O(nlogn)O(nlogn)O(nlogn)

// Problem: D1. Up the Strip (simplified version)
// Contest: Codeforces - Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))
// URL: https://codeforces.com/contest/1561/problem/D1
// Memory Limit: 128 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
#define lowbit(x) (x&(-x))
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=5000010,INF=0x3f3f3f3f;
const double eps=1e-6;int n,mod;
LL a[N],f[N];int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&mod);f[1]=1; LL add=0;for(int i=1;i<=n;i++) {a[i]+=a[i-1]; a[i]%=mod;f[i]=add+f[i]+a[i]; f[i]%=mod;add+=f[i]; add%=mod;for(int j=2;1ll*j*i<=n;j++) {int l=j*i,r=j*i+j-1; r=min(r,n+1);a[l]+=f[i]; a[r+1]-=f[i];a[l]%=mod; a[r+1]%=mod; a[r+1]+=mod; a[r+1]%=mod;}}cout<<f[n]%mod<<endl;return 0;
}
/*1 2 3 4 5 6 7 8
1-> 2 3 4 5 6 7 8
2-> [4,5]  */

Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维相关推荐

  1. Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块

    题目链接: http://codeforces.com/contest/677/problem/D 题意: 让你求最短的从start->...->1->...->2->. ...

  2. Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))

    Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 题号 题目 知识点 A Simply Strange Sor ...

  3. Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) A-F全题解

    Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 文章目录 A. Simply Strange Sort B. ...

  4. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  5. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  6. Codeforces Round #740 (Div. 2) E. Bottom-Tier Reversals 构造

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为奇数nnn的排列aaa,每次可以选择长度为奇数的前缀,并将[1,len][1,len][1,len]翻转,你需要用不超过5n2\frac{5n} ...

  7. Codeforces Round #730 (Div. 2) D2. RPD and Rap Sheet (Hard Version) 交互 + k进制的转换

    传送门 文章目录 题意: 思路: 题意: 定义a⊕kba\oplus_k ba⊕k​b为a,ba,ba,b在kkk进制下的不进位加法.系统会随机生成一个数xxx,你猜这个数,假设当前猜的数为yyy,如 ...

  8. Codeforces Round #602 (Div. 2) D2. Optimal Subsequences stl 黑科技

    传送门 文章目录 题意: 思路: 题意: 思路: 比较明显的是我们需要将序列从大到小排序,让后取前kkk个数,再从中选择第pospospos小的位置输出当前位置的数即可. 一开始想用setsetset ...

  9. Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,+++代表111,−-−代表−1-1−1,让后有qqq个询问,每次询问[l,r][l,r][l,r]区间,将这段区间的数拿出来,设为 ...

最新文章

  1. 理解 Kotlin 中的属性(property)
  2. C#后台创建Excel文件的那点事儿
  3. 磁共振线圈分类_收藏:磁共振检查序列及临床应用总结
  4. docker在Centos上的安装
  5. 的优缺点_浅谈桉木家具的优缺点
  6. 飞鸽传书最新源码类都要复杂的多
  7. 8能达到go速度吗 php_相同逻辑的php与golang代码效率对比,最好语言落谁家…
  8. php 中间表统计,多对多中间表详解
  9. 工厂员工晋升机制_维修厂如何设置员工晋升机制?
  10. 无法启用Windows Hello-某些设置由您的组织管理
  11. 剑指Offer——把字符串转换成整数
  12. http://www.myeclipseide.com/ 官网打不开的问题!myeclipse 官网!
  13. pyboard使用心得记录-基于对sk6812的控制(欢迎补充)
  14. 趣头条面试题:ThreadLocal是什么?怎么用?为什么用它?有什么缺点
  15. MongoDB基本操作
  16. 非北京户口的驾照到期换证小攻略(仅供参考)
  17. 三星S5660刷机及Root
  18. Android网络应用
  19. 车路协同、车联网、智慧交通、智能网联车、自动驾驶、无人驾驶、高精度地图
  20. 最简单的python语言程序设计_编程中最简单的语言Python,这样学或许更容易

热门文章

  1. 双时隙的工作原理_OFDM调制技术原理是什么 OFDM调制实现原理介绍【图文】
  2. python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解
  3. 微信改成右滑删除_手机文件数据恢复,怎样恢复已过期的微信附件呢?
  4. 第7章 C控制语句:分支和跳转
  5. 太努力工作的年轻人,都有病吧!?
  6. 代言男科、站台微商、变身神棍....这些科学家被捧了几十年,黑历史曝光后,让人三观尽毁......
  7. 颜宁分享干货:给实验室博士的一些忠告
  8. 30 个实例详解 TOP 命令
  9. c语言md5函数 linux,Linux下C语言计算文件的md5值(长度32)
  10. javadoc文档的生成方法_[springboot 开发单体web shop] 4. Swagger生成Javadoc