#include <math.h>
#include <queue>
#include <vector>
#include <utility>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef pair<double,pair<int,int>> Syara;
priority_queue<Syara,vector<Syara>,less<Syara>> q;
#define int long long
int fac[1000005],inv[1000005];
double lg[1000005];
const int p=1e9+7;
inline void init()
{
fac[0]=inv[0]=inv[1]=1;
int i,V=1000005;
for(i=1;i<=V;++i)
{
fac[i]=i*fac[i-1]%p;
lg[i]=lg[i-1]+log(i);
}
for(i=2;i<=V;++i)
{
inv[i]=(p-p/i)*inv[p%i]%p;
}
for(i=2;i<=V;++i)
{
(inv[i]*=inv[i-1])%=p;
}
return ;
}
long long res;
Syara mid;
signed main()
{
signed i;
init();
signed n,k;scanf("%d %d",&n,&k);
for(i=0;i<=n;++i)
q.push(make_pair(lg[n]-lg[i]-lg[n-i],make_pair(n,i)));
while(k--)
{
mid=q.top();
q.pop();
(res+=fac[mid.second.first]*inv[mid.second.second]%p*inv[mid.second.first-mid.second.second]%p)%=p;
q.push(make_pair(lg[mid.second.first-1]-lg[mid.second.second]-lg[mid.second.first-1-mid.second.second],make_pair(mid.second.first-1,mid.second.second)));
}
printf("%lld",res);
return 0;
}
这段人畜无害的代码,样例和 hack 都能通过,但是交上去却是 0 分。
关注 int i,V=1000005; 一行,我们发现当 i==V 时,数组访问越界,也就是说,此时我访问 fac[i] 相当于访问 inv[0] 以此类推。
将 V 改为 1e6 即可通过,警钟撅烂。