Codeforces:(C - New Year and Permutation)排列组合

做这种类型的一定要多思考
不要掉进“死胡同”
有时候,有些问题,正向思考和反向思考都尝试一下

在做这道题的时候老想着用总的个数 减去 不满足的个数
实际上正着想直接求满足的个数更简单

反着想 想了将近两个小时没推出来
日了够了

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;
}

发布了36 篇原创文章 · 获赞 4 · 访问量 1387

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/104707268