牛客练习赛64(C,D(容斥))

题目链接

C-序列卷积之和

题意:

成功看错题,看成连乘,推算了一个小时的规律,然后跳D题自闭了。

分析:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const ll mod=1e9+7;
inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e5+10;
ll s[N],a[N];
int n;
int main()
{
    n=read();
    rep(i,1,n) a[i]=read();
    per(i,n,1) {
        s[i]=s[i+1]+(n-i+1)*a[i]%mod;
        s[i]%=mod;

    }

    ll ans=0;
    rep(i,1,n)
    {
        //printf("s2:%lld\n",s[i]);
        ans+=i*a[i]%mod*s[i]%mod;
        ans%=mod;
    }
    printf("%lld\n",ans);

}
/*
4
1 2 3 4
*/

D-宝石装箱

链接:https://ac.nowcoder.com/acm/contest/5633/D
来源:牛客网

 

题目描述

n颗宝石装进n个箱子使得每个箱子中都有一颗宝石。第i颗宝石不能装入第ai​个箱子。求合法的装箱方案对998244353取模。

两种装箱方案不同当且仅当两种方案中存在一颗编号相同的宝石装在不同编号的箱子中。

官方题解:

#include<bits/stdc++.h>
using namespace std;
const int N=8005,mod=998244353;
typedef long long ll;
ll f[N],dp[N];
int n,a[N];
int main()
{
    f[0]=f[1]=1;
    for(int i=2;i<N;i++) f[i]=f[i-1]*i%mod;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        a[x]++;
    }
    dp[0]=1;
    for(int i=1;i<=n;i++)
        for(int j=i;j>=0;j--)
            (dp[j+1]+=dp[j]*a[i])%=mod;
    ll ans=0;
    for(int i=0,p=1;i<=n;i++,p*=-1)
        ans=(ans+p*dp[i]*f[n-i]%mod)%mod;
    ans=(ans+mod)%mod;
    printf("%lld\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/106296888