A Rikka with Lowbit
题目:有两个操作,一个就是将变为 ,二是求一个区间和的期望;
题解:可以看出就是一个区间和就可以啦。
代码:
#include
#define ll long long
using namespace std;
const ll mod = 998244353;
const int maxn = 1e5+7;
ll qpow(ll a, ll b) {
ll ans = 1ll;
while(b) {
if(b&1) ans = ans*a%mod;
a = a*a%mod;
b>>=1;
}
return ans;
}
ll a[maxn];
int main()
{
int t; scanf("%d", &t);
while(t--) {
ll n, m; scanf("%lld%lld", &n, &m);
ll A, B = qpow(2ll, n*m);
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
for(int i = 1; i <= n; i++) a[i] = (a[i]+ a[i-1])%mod;
for(int i = 0; i < m; i++) {
int t, l, r; scanf("%d%d%d", &t, &l, &r);
if(t==1) continue;
else {
A = (a[r] - a[l-1] + mod)%mod;
printf("%lld\n", A*B%mod);
}
}
}
return 0;
}
B Rikka with Burrow-Wheeler Transform
C Rikka with Rotate
D Rikka with Prefix Sum
题意:给一个数组a,一开始的值全为0,一共有三个操作:
1. 对区间[L,R]的每个数都加上w。
2. 将数组a用其前缀和数组代替。
3. 将询问区间[L,R]的区间和。题解:假设初始状态是t = 0,每执行一次 2 就t++,这样考虑每个1操作对于后面的影响,考虑是路径的问题,就是组合数。
代码:
#include
#include
#include
#include
#include
#include
#include
E Rikka with Equation
题意:一组系数,模数 ,定义为模线性方程的解数给出一个长度为的数组,对于的所有非空子集, ,,求所有的异或和。()
题解:证明,考虑中国剩余定理,将质因子分解成,考虑在每个下解的个数,总的解的个数就是各个结果的乘积;
因为是质数,因此,其中与互质的部分可以用其相对于逆元合并到中,则方程改写为,我们假设中最小的是,其他的部分看作,故方程是,所以方程有解的情况是,因为是最小的一个,故能够整除,且解数共有个(WK),剩下的的值可以随便取有种取值(题目中,所以在模下有种取值,我们合并一下答案就是,先写到这里,暂时留坑。
F Rikka with Line Graph
G Rikka with Shortest Path
H Rikka with Ants
I Rikka with Zombies
J Rikka with Nickname
分析:直接模拟吧。。。
代码:
#include
using namespace std;
string ans, s, t;
int main()
{
int T;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
cin >> ans; n--;
while(n--) {
cin >> s;
int i = 0, j = 0;
for(; i < ans.length()&&j < s.length(); i++) {
if(ans[i] == s[j]) j++;
}
for(; j < s.length(); j++) ans += s[j];
}
cout << ans << endl;
}
return 0;
}