做这种类型的一定要多思考
不要掉进“死胡同”
有时候,有些问题,正向思考和反向思考都尝试一下
在做这道题的时候老想着用总的个数 减去 不满足的个数
实际上正着想直接求满足的个数更简单
反着想 想了将近两个小时没推出来
日了够了
1-n个数的全排列
这道题直接求满足的区间,即极差等于区间差
而要满足极差等于区间差,这区间里的数必须是连续的呀
既然是连续的,直接枚举极差或区间差
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[300000],n,m;
void init()
{
ll ans=1;
for(int i=1;i<=250000;i++)
{ans=ans*i%m;
a[i]=ans;}
}
int main()
{
cin>>n>>m;
init();
ll ans=0;
for(int i=1;i<=n;i++)
{
ans=(ans%m+(i%m*a[n-i+1]%m*a[i]%m)%m)%m;
}
cout<<ans<<endl;
return 0;
}