題目鏈接:傳送門
題意:
T組測試樣例,每組測試樣例輸入N,X,Y,N代表一個數組的長度,X代表數組的第一個數,Y代表數組的最後一個數,問排列1~N有多少種可能,並且滿足 ,(1≤i<N) 。
思路:
由題意我們可以把x,y分爲4種情況,即x=1且y=n,x=1但y!=n,x!=1但y=n,x!=1且y!=n這4種情況,下面分情況討論:
① x=1且y=n
此時,可以得出排列的可能有a [ i ] = a [ i - 1 ] + a [ i - 3 ]種;
② x=1但y!=n(爲了方便找出規律,假設n=7)
此時,多舉幾個栗子,你會發現y-1到n的數排列方式是確定的,只有一種,觀察出此時排列的可能有a [ y - 1 ] 種;
③ x!=1但y=n (爲了方便找出規律,假設 n=7)
此時,多列出一些式子,你會發現1到x+1的排列方式是確定的,只有一種,觀察此時排列的可能一共a [ n - x ] 種;
④x!=1且y!=n(爲了方便找出規律,假設 n=7)
觀察此時分兩種情況,若y = x+1,則排列爲0;否則,排列一共有a [ y - x - 1] 種;
一個栗子不具有代表性,自己在做的時候可以多整幾個栗子測試一下。
My Code:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<queue>
#include<math.h>
#include<set>
#include<time.h>
#pragma GCC optimize(2)
using namespace std;
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
#define PI acos(-1)
ll a[100005];
int main()
{
a[1] = a[2] = a[3] = 1;
for(int i = 4; i <= 100000; i++)
a[i] = (a[i-1] + a[i-3]) % 998244353;
int t,n,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&x,&y);
if(x == 1 && y == n) cout << a[n] << endl;
else if(x == 1) cout << a[y-1] << endl;
else if(y == n) cout << a[n-x] <<endl;
else if(y == x + 1) printf("0\n");
else cout << a[(y-1)-(x+1)+1] << endl;
}
}