关于static修饰符
  • 板块学术版
  • 楼主complexor
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/1/19 11:26
  • 上次更新2023/10/28 11:58:44
查看原帖
关于static修饰符
368995
complexor楼主2022/1/19 11:26

蒟蒻在做 P1919 【模板】A*B Problem 升级版(FFT 快速傅里叶变换) 这题时遇到一个关于staticstatic修饰符的问题:

在NTT时:

void NTT(int *g, bool fl, int n)
{
	tsetup(n);
	static ull f[MAXN << 1], w[MAXN << 1] = {1};//就是这里
	for (int i = 0; i < n; i++)
		f[i] = (((ll)MOD << 5) + g[tr[i]]) % MOD;
	for (int len = 1; len < n; len <<= 1)
	{
		ull rt = fpow(fl ? _G : invG, (MOD - 1) / (len << 1));
		for (int i = 1; i < len; i++)
			w[i] = w[i - 1] * rt % MOD;
		for (int p = 0; p < n; p += (len << 1))
			for (int cur = 0; cur < len; cur++)
			{
				int t = w[cur] * f[p | len | cur] % MOD;
				f[p | len | cur] = f[p | cur] + MOD - t;
				f[p | cur] = f[p | cur] + t;
			}
		if (len == (1 << 10))
			for (int i = 0; i < n; i++)
				f[i] %= MOD;
	}
	if (fl)
		for (int i = 0; i < n; i++)
			g[i] = f[i] % MOD;
	else
	{
		ull invn = inv(n);
		for (int i  =0; i < n; i++)
			g[i] = f[i] % MOD * invn % MOD;
	}
}
oid NTT(int *g, bool fl, int n)
{
	tsetup(n);
	ull f[MAXN << 1], w[MAXN << 1] = {1};//还是这里
	for (int i = 0; i < n; i++)
		f[i] = (((ll)MOD << 5) + g[tr[i]]) % MOD;
	for (int len = 1; len < n; len <<= 1)
	{
		ull rt = fpow(fl ? _G : invG, (MOD - 1) / (len << 1));
		for (int i = 1; i < len; i++)
			w[i] = w[i - 1] * rt % MOD;
		for (int p = 0; p < n; p += (len << 1))
			for (int cur = 0; cur < len; cur++)
			{
				int t = w[cur] * f[p | len | cur] % MOD;
				f[p | len | cur] = f[p | cur] + MOD - t;
				f[p | cur] = f[p | cur] + t;
			}
		if (len == (1 << 10))
			for (int i = 0; i < n; i++)
				f[i] %= MOD;
	}
	if (fl)
		for (int i = 0; i < n; i++)
			g[i] = f[i] % MOD;
	else
	{
		ull invn = inv(n);
		for (int i  =0; i < n; i++)
			g[i] = f[i] % MOD * invn % MOD;
	}
}

有没有大佬知道这是什么原因?

2022/1/19 11:26
加载中...