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); } } }