列表

详情


NC212195. 序列问题

描述

存在一个集合S,由1到n这n这元素组成,A,B是S的两个非空子集,若对于任意的元素X∈A,Y∈B,皆满足Y-X>=q,则称A,B是一组满足条件的集合组。多组询问,每次给出n,q,求对于集合S,有多少组满足条件集合组,答案对998244353取模。

输入描述

第一行一个数t,代表询问次数。

随后t行,每行两个数,n,q,意义如题所示。

输出描述

一共t行,每行一个数,及满足条件的集合组数目。

示例1

输入:

1
7 0

输出:

769

示例2

输入:

1
7 -8

输出:

16129

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 121ms, 内存消耗: 1344K, 提交时间: 2020-12-26 18:39:35

#include<bits/stdc++.h>
using namespace std;

int T;
long long n,q;
const long long mod=998244353;

long long ksm(long long x,long long t){
	long long tot=1;
	while(t){
		if(t&1) tot=tot*x%mod;
		x=x*x%mod;
		t/=2;
	}
	return tot;
}

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%lld %lld",&n,&q);
		if(q>=0){
			if(q>=n) printf("0\n");
			else printf("%lld\n",((n-q-1)%mod*ksm(2,n-q)+1)%mod);
		}
		else{
			q=-q;q=min(q,n-1);
			printf("%lld\n",((n-q)%mod*ksm(2,n+q)%mod+1ll*ksm(2,n)*(ksm(2,q)+mod-1)%mod+mod-ksm(2,n)+1)%mod);
		}
	}
}

上一题