警示后人 / 有关数组下标越界
查看原帖
警示后人 / 有关数组下标越界
575994
Hisaishi_Kanade楼主2023/2/5 16:07
#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 即可通过,警钟撅烂。

2023/2/5 16:07
加载中...