如题,我因挂掉 20 分后开 long long 检测,但是前 3 个点却莫名其妙 WA 掉了,而数据在本机测试跑的很快,不知道为什么在洛谷上测出来是 TLE 的状态,求助/kel
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int mod = 998244353;
const int inf = (1 << 30);
inline int Add(int x, int y){return 1ll * (x + y) >= mod ? 1ll * (x + y - mod) : 1ll * (x + y);}
inline int Mul(int x, int y){return 1ll * x * y % mod;}
inline int Dec(int x, int y){return 1ll * (x - y + mod) % mod;}
int qpow(int x, int y){
int res = 1;
while(y){
if(y & 1) res = Mul(res, x);
x = Mul(x, x); y >>= 1;
}
return res;
}
#define pb emplace_back
#define pc putchar
#define poly vector<int>
inline ll read(){
int s = 0, w = 1;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') w = -1;
ch = getchar();
}
while(isdigit(ch)){
s = s * 10 + ch - '0';
ch = getchar();
}
return w == -1 ? -s : s;
}
const int N = 2e5 + 10;
inline void write(int x){
if(x < 0) pc('-'), x = -x;
if(x > 9) write(x / 10);
pc(x % 10 + '0');
}
namespace Refined_heart{
ll n, x, y, z;
ll pwy[500], pwz[500];
namespace Sub1{
ll ans = 0;
int getit(int x, int p){
int res = 0;
while(x){
res += x % p;
x /= p;
}
return res;
}
void solve(){
int xx = 1;
for(int i = 1; i <= n; ++i){
xx = Mul(xx, x);
int res = xx;
int c1 = getit(i, 2);
int c2 = getit(i, 3);
res = Mul(res, Mul(pwy[c1], pwz[c2]));
ans = Add(ans, res);
}
cout << ans << '\n';
}
}
namespace Sub2{
int f[40][700][2];
int g[50], lim;
int dfs(int now, int sum, int tg){
if(now == 31) return f[now][sum][tg] = 1;
if(~f[now][sum][tg]) return f[now][sum][tg];
int &res = f[now][sum][tg]; res = 0;
for(int i = 0; i < 3; ++i){
if(tg && i > g[now]) continue;
if(sum + i > lim) continue;
int ok = tg;
if(tg && i == g[now]) ok = 1;
else ok = 0;
res = Add(res, dfs(now + 1, sum + i, ok));
}
return res;
}
void clear(){
for(int i = 0; i < 40; ++i)
for(int j = 0; j < 700; ++j)
for(int k = 0; k < 2; ++k)
f[i][j][k] = -1;
}
int ans[6000];
int pwx[100][4];
int dfs2(int now, int sum, int tg){
if(now == 31) return f[now][sum][tg] = 1;
if(~f[now][sum][tg]) return f[now][sum][tg];
int &res = f[now][sum][tg]; res = 0;
for(int i = 0; i < 3; ++i){
if(tg && i > g[now]) continue;
if(sum + i > lim) continue;
int ok = tg;
if(tg && i == g[now]) ok = 1;
else ok = 0;
res = Add(res, Mul(pwx[30 - now][i], dfs2(now + 1, sum + i, ok)));
}
return res;
}
void solve(){
//13306748
int cnt = 30;
ll v = n;
while(v){
g[cnt] = v % 3;
cnt = cnt - 1;
v = v / 3;
}
for(int i = 0; i < 100; ++i) {
clear(); lim = i;
ans[i] = dfs(1, 0, 1);
}
ll Ans = 0;
for(int i = 1; i < 100; ++i){
ll dt = Dec(ans[i], ans[i - 1]);
Ans = Add(Ans, Mul(dt, pwz[i]));
}
cout << Ans << '\n';
}
void solve2(){
int cnt = 30;
ll v = n;
while(v){
g[cnt] = v % 3;
cnt = cnt - 1;
v = v / 3;
}
v = 1;
for(int i = 0; i < 40; ++i){
if(i == 0) v = 1;
else v = 1ll * v * 3 % (mod - 1);
pwx[i][0] = 1;
for(int j = 1; j < 3; ++j){
pwx[i][j] = qpow(x, v * j % (mod - 1));
}
}
for(int i = 0; i < 100; ++i){
clear(); lim = i;
ans[i] = dfs2(1, 0, 1);
}
ll Ans = 0;
for(int i = 1; i < 100; ++i){
ll dt = Dec(ans[i], ans[i - 1]);
Ans = Add(Ans, Mul(dt,pwz[i]));
}
cout << Ans << '\n';
}
}
void solve(){
n = read(); x = read(); y = read(); z = read();
pwy[0] = pwz[0] = 1;
for(int i = 1; i < 500; ++i){
pwy[i] = Mul(pwy[i - 1], y);
pwz[i] = Mul(pwz[i - 1], z);
}
if(n <= 10000000){
Sub1::solve();
return;
}
if(x == 1 && y == 1){
Sub2::solve();
return ;
}
if(y == 1){
Sub2::solve2();
return ;
}
Sub1::solve();
}
}
signed main(){
freopen("in.txt","r",stdin);
// freopen("conversion.in","r",stdin);
// freopen("conversion.out","w",stdout);
Refined_heart::solve();
return 0;
}