您的位置:首页 > 其它

递推/思维 (2019杭电多校第五场HDU-6630 permutation 2)

2019-08-05 17:55 381 查看

题目链接
可以假定:1,x, y, N,在一个数轴上。这是问题转化为:

从x开始,每次可以向左(右)走1(2)步,最后1~N每点都走且只走一遍最后到达y的方法数。

我们注意到,对于一个长度大于2区间,我们最多途径两遍(一个来回)所以,行走方法只有一种

x–>1
1–>N(不经过x,y)
N–>y

另外,显然从x–>1,和从1–>x+1的过程只有一个可能。y-1 --> N, N–>y同理。
所以最终可能数是从x+1 到 y-1的可能数。(当x!=1 && y != N时)
推出间隔公式:

f[x] = f[x-1] + f[x-3]

另外,如果x== 1 || y== N,我们只要从x出发或到y结束即可。

下面是ac代码:

#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const int N = 1e6+6;
const ll mod = 998244353;
typedef unsigned long long ull;
ll f[N];
int main()
{
f[0] = 1;
f[1] = f[2] = 1;
for (int i = 3; i <= 1000005; i++)
f[i] = (f[i-1] + f[i-3]) % mod;
int t;
cin >> t;
while(t--)
{
int a, b;
int n;
scanf("%d%d%d", &n, &a, &b);
if (a != 1) a++;
if (b != n) b--;
printf("%lld\n", f[b - a]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: