首页 > 其他分享 >Luogu P10812

Luogu P10812

时间:2024-09-17 16:34:37浏览次数:10  
标签:P10812 cout int Luogu sum MAXN dp MOD

题目描述

给定一根 \(1\) 到 \(N\) 的数轴。一开始有一个棋子在 \(N\)。每次棋子 \(x\) 可以跳到 \(x-1,x+1\) 或 \(x\) 的因子处(不能超出 \(1\) 到 \(N\))。

每个点只能到达一次。求棋子到达 \(1\) 的方案数。

思路

由于求倍数比因子简单,所以把问题变成从 \(1\) 到 \(N\),每次跳倍数。

我们可以发现,棋子的行走路径由两种类型的路拼在一起:

image

由于有先跳倍数再 \(-1\) 的跳法,此时跳的倍数必须大于走过的最远的位置,所以状态中要记录最远走到哪里。

令 \(dp_{i,j}\) 表示当前在 \(i\),最远走到了 \(j\) 的方案数。

当 \(i=j\) 时,我们有转移 \(dp_{i+1,i+1}\leftarrow dp_{i,j}\)。

当然我们也可以跳倍数,也就是对于每个 \(k=i\cdot m(m>1)\),那么都有转移 \(dp_{x,k}\leftarrow dp_{i,j}(j<x\le k)\)。

而这种转移可以使用前缀和维护。

空间复杂度 \(O(N^2)\),时间复杂度 \(O(N^2\log N)\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 5005;

int n, MOD, dp[MAXN][MAXN], sum[MAXN][MAXN];

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> MOD;
  dp[1][1] = 1;
  for(int i = 1; i <= n; ++i) {
    for(int j = i; j <= n; ++j) {
      sum[j][i] = sum[j][i] + sum[j][i - 1] - (sum[j][i] + sum[j][i - 1] >= MOD ? MOD : 0);
      //cout << sum[j][i] << " \n"[j == n];
      dp[i][j] = dp[i][j] + sum[j][i] - (dp[i][j] + sum[j][i] >= MOD ? MOD : 0);
      //cout << dp[i][j] << " \n"[j == n];
      if(i == j) {
        dp[i + 1][max(i + 1, j)] = dp[i + 1][max(i + 1, j)] + dp[i][j] - (dp[i + 1][max(i + 1, j)] + dp[i][j] >= MOD ? MOD : 0);
      }
      for(int k = 2 * i; k <= n; k += i) {
        if(k > j) {
          sum[k][j + 1] = sum[k][j + 1] + dp[i][j] - (sum[k][j + 1] + dp[i][j] >= MOD ? MOD : 0);
        }
      }
    }
  }
  cout << dp[n][n];
  return 0;
}

标签:P10812,cout,int,Luogu,sum,MAXN,dp,MOD
From: https://www.cnblogs.com/yaosicheng124/p/18417280

相关文章

  • Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
    水影若深蓝:挺好的一道并查集构造题。观察不难发现“距离为\(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为\(2\)的点染成相同颜色。这个染色问题就很并查集。于是我们用并查集维护相同的种类。显然,当图上只有一个连通块的......
  • luogu2516题解
    随机说话第一次交的时候写的版本是这个。下面在sum的计算上少了个else,遂出错。以后写的时候还是尽量简单点,主要是调试的时候好调。题目分析题目里面的公共子序列就是可以不连续可以为空的在字符串里出现顺序相同的子串。对于一个公共子序列,在找到最后一个公共的字符的时......
  • Luogu P11036 GCD 与 LCM 问题 [ 蓝 ] [ 构造 ] [ 数论 ] [ adhoc ]
    LuoguP11036GCD与LCM问题:梦熊的题真是又神又逆天。思路观察到有个奇数的特殊性质,我们尝试从奇数构造入手。先来尝试带入极端数据,对于\(\gcd\),我们可以把\(b=1\)的情况先带进去看看。\[a+b+c+d=\gcd(a,b)+\operatorname{lcm}(c,d)\]\[a+1+c+d=1+\operatorname{lcm}(c,......
  • luogu4198题解
    随机说话这个题做法没见过记一下。我一开始以为是李超树的题,结果把李超树打上之后就不会做了。然后题读错了写了一个弱化版。题目分析做法参考这个题题意只是假装是一个有关线段的题。简化之后的题意如下。有一个初始都为\(0\)的实数数列,每一次会修改位置\(x\)的数为......
  • [luoguAT_abc369_f]Gather Coins
    题意给定\(N\timesM\)的网格,给定\(K\)个二元组\((x_1,y_1),(x_2,y_2),\cdots,(x_K,y_K)\),求从\((1,1)\)到\((N,M)\)只向右或向下走最多可以经过多少个给定的方格,并给出一种方案。赛时不会赛后由于只能向右或向下走,因此当前所处位置\((nowx,nowy)\)中,\(......
  • [luoguAT_abc369_e] Sight[luoguAT_abc369_e]Sightseeing Tour
    题意给定一个包含\(N\)个点和\(M\)条无向边的带权图,保证图中没有自环,但可能包含重边。给出\(Q\)次查询,每次查询给出\(K\)条边\(B_1,B_2,\cdots,B_K\),要求求出从节点\(1\)到节点\(N\)且这\(K\)条边都至少经过一次的最短路(经过边的方向和顺序任意)。赛时Dijkstra......
  • Luogu P2114 起床困难综合症
    LuoguP2114起床困难综合症由于这道题的三个操作都是位运算,所以我们可以按位考虑,即考虑初始攻击力和最后伤害的每一位分别是$0$还是$1$。因此我们可以先算出每一位分别取$0$和取$1$在经过所有防御门后最后得到的是什么,然后从高位向低位贪心即可。需要注意的是(也是被卡......
  • Luogu8990 做题记录
    link比较喜欢的题目。考虑合法的条件,从点亮的灯的角度难以维护。反过来看,从未点亮的灯角度考虑,条件相当于这些灯形成了一个包含\(1\)号灯的连通块。如何判定这些灯形成一个连通块?点减边!设\(c_i\)为操作前\(i\)次后,未点亮的灯的\(|V|-|E|\)的值,那么\(c_i=1\)即合......
  • luogu P3808/3796
    首先Trie树:#include<bits/stdc++.h>usingnamespacestd;intT,q,n,t[3000005][65],cnt[3000005],idx;chars[3000005];intgetnum(charx){if(x>='A'&&x<='Z')returnx-'A';elseif(x>='a......
  • [luoguP4051/JSOI2007] 字符加密
    题意给定字符串\(s\),输出将\(s\)的所有循环同构的字符串排序后,每个字符串的末尾的字符。sol因为要对循环同构的字符串排序,因此我们可以将\(s\)复制一遍,拼在后面,计算\(sa\),满足\(sa_i\len\)的所有元素的相对位置即为排序后字符串的相对位置,输出即可\(sa\)的计算详见......