题解:P14321 「ALFR Round 11」D Adjacent Lifting, Fewest Rounds
2672434062xzl · · 题解
一道培养注意力机制的好题,主要是笔者的水平的太低,没法快速想到正解。
| 先看小样例: | 1 | 3 | 5 | 7 | 9 |
|---|---|---|---|---|---|
发现差不多是
| 1! | 3! | 5! | 7! | 9! |
|---|---|---|---|---|
上面除以下面得到:
| 1 | 3 | 5 | 7 | 9 |
|---|---|---|---|---|
改一下分母:
| 1 | 3 | 5 | 7 | 9 |
|---|---|---|---|---|
发现分母为
而分子可以表示为:
| 1 | 3 | 5 | 7 | 9 |
|---|---|---|---|---|
注意到分子在
综上所述,答案即为
线性求逆元和阶乘,
参考代码:
#include<iostream>
using namespace std;
using ll=long long;
const ll N=1e7;
ll mod;
ll inv[N+10],fac[N+10];
int main(){
int t;
cin>>t>>mod;
fac[0]=1;
inv[1]=1;
for(int i=1;i<=N;++i)fac[i]=fac[i-1]*i%mod;
for(int i=2;i<=N;++i)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(;t;--t){
ll n;
scanf("%lld",&n);
printf("%d\n",fac[n]*inv[(n+3)/2]%mod*((n+1)*(n+1)/4%mod-(n+1)/2%2)%mod);
}
}