关于本题前 3 个点超时
查看原帖
关于本题前 3 个点超时
128591
Refined_heart楼主2022/5/16 19:19

如题,我因挂掉 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;
}


2022/5/16 19:19
加载中...