萌新$NTT$ 求助 全$TLE$ qwq
  • 板块P2000 拯救世界
  • 楼主Bn_ff
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/5/17 21:25
  • 上次更新2023/11/7 02:15:00
查看原帖
萌新$NTT$ 求助 全$TLE$ qwq
182318
Bn_ff楼主2020/5/17 21:25
#include<bits/stdc++.h>
#define ll long long
#define F(i, x, y) for(register int i = x; i <= y; ++ i)
using namespace std;
const int N = 5e6 + 5;
const int mod = 998244353;
const int G = 3;
const int GI = 332748118;
int la, lb, lim;
ll inv, x, n = 1;
ll a[N], b[N];
char s[N];
inline ll qpower(ll x, int y)
{
	ll res = 1;
	while(y)
	{
		if(y & 1) res = res * x % mod;
		x = x * x % mod, y >>= 1;
	}
	return res;
}
inline void ntt(ll *a, int op)
{
	F(i, 0, n - 1)
	{
		int t = 0;
		F(j, 0, lim - 1) if((i >> j) & 1) t |= (1 << (lim - j - 1));
		if(i < t) swap(a[i], a[t]);
	}
	for(int m = 1; m < n; m <<= 1)
	{
		ll omg = qpower((op == 1 ? G : GI), (mod - 1) / (m << 1));
		for(int j = 0; j < n; j += (m << 1))
		{
			ll w = 1;
			for(int i = 0; i < m; ++ i, w = w * omg % mod)
			{
				ll t = w * a[j + i + m] % mod;
				a[j + i + m] = (a[j + i] - t + mod) % mod, a[j + i] = (a[j + i] + t) % mod;
			}
		}
	}
}
inline void solve(int x)
{
	lb = strlen(s);
	F(i, 0, lb - 1) b[i] = s[lb - i - 1] - '0';
	b[0] += x;
	F(i, 1, lb - 1) b[i] += b[i - 1] / 10, b[i - 1] %= 10;
	ntt(a, 1), ntt(b, 1);
	F(i, 0, n) a[i] = a[i] * b[i] % mod, b[i] = 0;
	ntt(a, -1), inv = qpower(n, mod - 2);
	F(i, 0, n + 1) a[i] = a[i] * inv % mod;
	F(i, 0, n + 1) a[i + 1] = (a[i + 1] + a[i] / 10) % mod, a[i] %= 10;
}
int main()
{
	scanf("%s", s), la = strlen(s);
	F(i, 0, la - 1) a[i] = s[la - i - 1] - '0';
	++ a[0]; F(i, 1, la - 1) a[i] += a[i - 1] / 10, a[i - 1] %= 10;
	while(n <= la * 5) n <<= 1, ++ lim;
	solve(2), solve(3), solve(4);
	for(int i = n; i >= 0; -- i) x = x * 10 + a[i], b[i] = x / 24, x %= 24;
	lb = n; while(! b[lb - 1] && lb) -- lb;
	for(int i = lb - 1; i >= 0; -- i) printf("%lld", b[i]); 
	return 0;
}
2020/5/17 21:25
加载中...