68分WA求助
查看原帖
68分WA求助
374851
lian13817981484楼主2023/11/13 16:37

https://www.luogu.com.cn/record/134895888

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
inline ll read(){
	ll ans = 0;
	char c = getchar();
	while(c < '0' || c > '9'){
		c = getchar();
	}
	while('0' <= c && c <= '9'){
		ans = (ans<<3)+(ans<<1)+c-'0';
		c = getchar();
	}
	return ans;
}
inline void write(ll x){
	if(x == 0)return;
	write(x/10);
	putchar('0'+x%10); 
}
const ll mod = 998244353;
const ll mod1 = mod+1>>1;
const ll mod2 = (mod+1)/6;
ll dp[16][9][6][4][3][6005],cnt[105],jc[25];
inline ll dfs(int n,ll a,ll b,ll c,ll d,ll e,int k){
	if(a < 0 || b < 0 || c < 0 || d < 0 || e < 0 || k < 0)return 0;
	if(k == 0)return !(a || b || c || d || e);
	if(~dp[a][b][c][d][e][k])return dp[a][b][c][d][e][k];
	int p = a+b+c+d+e;
	p = p*(n-p+1);
	dp[a][b][c][d][e][k] = 0;
	dp[a][b][c][d][e][k] += dfs(n,a-1,b,c,d,e,k-1*p);
	dp[a][b][c][d][e][k] %= mod;
	dp[a][b][c][d][e][k] += dfs(n,a,b-1,c,d,e,k-2*p);
	dp[a][b][c][d][e][k] %= mod;
	dp[a][b][c][d][e][k] += dfs(n,a,b,c-1,d,e,k-3*p);
	dp[a][b][c][d][e][k] %= mod;
	dp[a][b][c][d][e][k] += dfs(n,a,b,c,d-1,e,k-4*p);
	dp[a][b][c][d][e][k] %= mod;
	dp[a][b][c][d][e][k] += dfs(n,a,b,c,d,e-1,k-5*p);
	dp[a][b][c][d][e][k] %= mod;
	return dp[a][b][c][d][e][k];
}
inline ll ans1(ll n,ll m){
	n %= mod;
	m %= mod;
	ll ans = ((((n+1)*m)%mod*(m+1))%mod*mod1)%mod;
	ans -= (((m*(m+1))%mod*(2*m+1))%mod*mod2)%mod;
	return (ans+mod)%mod;
}
inline ll ans2(ll n){
	//n %= mod;
	ll m = n>>1,ans = 0,t;
	for(int i = 0;i < 63;i++)cnt[i+1] = n>>i;
	for(int i = 1;i < 63;i++)cnt[i] -= cnt[i+1];
	if(n%2 == 1){
		ans = ((m+1)*(n-m))%mod;
		cnt[1]--;
	}
	for(int i = 1;i <= 63;i++){
		t = cnt[i]>>1;
		m -= t;
		ans = (ans+(2*(ans1(n,m+t)-ans1(n,m)+mod)%mod*i)%mod)%mod;
		if(cnt[i]%2 == 1){
			ans = (ans+m%mod*((n-m+1)%mod)%mod*i%mod)%mod;
			ans = (ans+m%mod*((n-m+1)%mod)%mod*(i+1)%mod)%mod;
			cnt[i+1]--;
			m--;
		}
	}
	for(int i = 0;i < 63;i++)cnt[i+1] = n>>i;
	for(int i = 1;i < 63;i++)cnt[i] -= cnt[i+1];
	return ans%mod;
} 
int q;
ll n,k,x,y;
int main(){
	q = read();
	jc[0] = 1;
	for(ll i = 1;i <= 15;i++){
		jc[i] = jc[i-1]*i;
	}
	for(int i = 1;i <= q;i++){
		n = read();
		k = read();
		x = ans2(n);
		if(n > 28){
			if(x == 0)putchar('0');
			else write(x);
			putchar('\n');
			continue;
		}
		for(int j = 1;j <= 5;j++){
			k = (k-1)/jc[cnt[j]]+1;
		}
		memset(dp,0xff,sizeof(dp));
		while(true){
			y = dfs(n,cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],x);
//printf("[note]y=%lld\n",y);
			if(y >= k){
				if(x == 0)putchar('0');
				else write(x);
				putchar('\n');
				break;
			}
			k -= y;
			x++;
			x %= mod;
		}
	}
	return 0;
}
//GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

2023/11/13 16:37
加载中...