Newcoder 148 A.Rikka with Lowbit(水~)
阿新 • • 發佈:2018-12-11
Description
給出一個長度為的序列,定義操作,概率把,概率,現在對這個序列做次操作,操作有兩種:
把變成
查詢區間和的期望
Input
第一行一整數表示用例組數,每組用例首先輸入兩個整數,之後輸入個整數,最後行每行一個操作
Output
對於每次查詢操作,假設區間和為,則輸出
Sample Input
1 3 6 1 2 3 1 3 3 2 1 3 1 3 3 2 1 3 1 1 3 2 1 3
Sample Output
1572864 1572864 1572864
Solution
期望為,而每個位置相互獨立,故求和期望即為期望求和,查詢操作變成查詢原先序列區間和
Code
#include<cstdio> using namespace std; typedef long long ll; #define maxn 100005 #define mod 998244353 int mul(int x,int y) { ll z=1ll*x*y; return z-z/mod*mod; } int add(int x,int y) { x+=y; if(x>=mod)x-=mod; return x; } int Pow(int x,ll y) { int ans=1; while(y) { if(y&1)ans=mul(ans,x); x=mul(x,x); y>>=1; } return ans; } int T,n,m,a[maxn]; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]=add(a[i],a[i-1]); int res=Pow(2,(ll)n*m); while(m--) { int op,l,r; scanf("%d%d%d",&op,&l,&r); if(op==2) { printf("%d\n",mul(add(a[r],mod-a[l-1]),res)); } } } return 0; }