萌新求助:WA on #8 #9
查看原帖
萌新求助:WA on #8 #9
438461
liu_chen_hao楼主2023/8/1 17:46

调了一天了

#include <bits/stdc++.h>
#define debug cout<<"zzy AK lch\n";
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define mp make_pair
#define b_s basic_string
#define fir first
#define sec second
#define ll long long
#define int long long
#define ull unsigned long long
#define ld long double
using namespace std;
const int M=105;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const ll  INF=0x3f3f3f3f3f3f3f3f;

int aqx,m,cnt;
ll n,a[M],len[M],ans,tmp,s[M][M],id,yu[M],L,inv[M],pre[M],suf[M],fac[M],F[M];

ll read() {
    ll sss=0,www=1;
    char ccch=getchar();
    while(ccch<'0' || ccch>'9') { if(ccch=='-') www=-1; ccch=getchar(); }
    while(ccch>='0' && ccch<='9') sss=sss*10+ccch-'0',ccch=getchar();
    return sss*www;
}
void Add(ll &xcr, ll zzy) { xcr=(xcr+zzy)%mod; }
ll qpow(ll x, ll y) {
	ll rnt=1;
	for(; y; y>>=1) {
		if(y&1) rnt=rnt*x%mod;
		x=x*x%mod;
	} return rnt;
}
ll f(ll x)
{
	int k=m+5;
    if(x<=k) return F[x];
    ll rnt=0;
    suf[k+1]=1,pre[0]=1;
    for(int i=1; i<=k; i++) pre[i]=pre[i-1]*(x-i)%mod;
    for(int i=k; i; i--) suf[i]=suf[i+1]*(x-i)%mod;
    for(int i=1; i<=k; i++)
    {
    	rnt=(rnt+((((k-i)&1)?-1ll:1ll) * 
    		(pre[i-1]*suf[i+1]%mod*inv[i-1]%mod*inv[k-i]%mod)%mod*F[i])%mod)%mod;
    	rnt=(rnt%mod+mod)%mod;
    }
	return (rnt%mod+mod)%mod;
}
signed main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    //ios::sync_with_stdio(false);
    m=56;
    fac[0]=1;
    for(int i=1; i<=m; i++) fac[i]=fac[i-1]*i%mod;
    inv[m]=qpow(fac[m],mod-2);
	for(int i=m; i; i--) inv[i-1]=inv[i]*i%mod;

    aqx=read();
    while(aqx--)
    {
    	n=read(),m=read();
    	for(int i=1; i<=m; i++) a[i]=read();

    	cnt=0;
    	sort(a+1,a+m+1);
    	for(int i=1; i<=m; i++)
    	{
    		if(a[i]-a[i-1]>1) len[++cnt]=a[i]-a[i-1]-1,yu[cnt]=1;
    		else ++yu[cnt];
    	}
    	if(n-a[m]>1) len[++cnt]=n-a[m],yu[cnt]=0;

    	// for(int i=1; i<=cnt; i++) cout<<len[i]<<' '<<yu[i]<<endl;

    	for(int i=1; i<=m; i++)
    		for(int j=i; j<=m; j++)
    			s[i][j]=((-qpow(a[j]-a[i-1],m+1))%mod+mod)%mod;
    	F[1]=1;
    	for(int i=2; i<=m+5; i++) F[i]=(F[i-1]+qpow(i,m+1))%mod;
    	ans=0,tmp=0,id=0,L=1;
    	for(int i=1; i<=m+1; i++)
    	{
    		Add(ans,f(n-tmp-id));
    		for(int j=i; j<=m; j++) Add(ans,s[i][j]);
    		++id;
    		if(id==yu[L]) tmp+=len[L]+yu[L],++L,id=0;
    	}
    	printf("%lld\n", ans);
    }
    
    return 0;
}
2023/8/1 17:46
加载中...