太离谱了,有谁能解释一下?
查看原帖
太离谱了,有谁能解释一下?
566177
JustLazyBone楼主2023/7/3 17:31
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define N 1000010

ll t,n,m,d[N],jc[N];
ll mod=1e9+7;

ll qpow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=(ans*a)%mod;
        a=(a*a)%mod;
        b >>=1;
    }
    return ans;
}

ll c(ll n,ll m)
{
    return (jc[n]%mod*qpow(jc[n-m]*jc[m]%mod,mod-2)%mod)%mod;//x
}

ll lucas(ll n,ll m)
{
    if(!m) return 1;//x
    return (lucas(n/mod,m/mod)*c(n%mod,m%mod))%mod;
}

int main()
{
    cin>>t;
    d[1]=0;
    d[2]=1;
    jc[1]=1;
    jc[2]=2;
    for(ll i=3;i<=N-10;i++)
    {
        d[i]=((i-1)*(d[i-1]+d[i-2])%mod)%mod;
        jc[i]=(jc[i-1]*i)%mod;
    }
    while(t--)
    {
        cin>>n>>m;
        if(n==m) puts("1");
        else if(n-m==1) printf("0\n");
        else if(m==0) printf("%lld\n",d[n]);
        else
        {
            //x
            ll ans=(lucas(n,m)*d[n-m]%mod)%mod;
            printf("%lld\n",ans);
        }
    }
    return 0;
}


这是改过之后的代码,原本我的思路是错的,while循环里面的特判是这样写的

if(n==0) cout<<0<<endl;
else if(n-m==0) cout<<1<<endl;
else if(m==0) cout<<d[n]<<endl;

后来发现思路是错的但是特判改成正确的思路之后一直报wa,后来发现是输出的问题。

但是最离谱的是改过之前的代码,特判是错的,竟然AC了,有谁能告诉我为啥?

2023/7/3 17:31
加载中...