小米 Online Judge 19年2月常規賽題解

韓師學子--胖佳發表於2019-03-01

                   小米 Online Judge 19年2月常規賽題解

 

描述
 

小愛同學有一個智慧密碼鎖。鎖上有九位數字,小愛同學每次會給A,B,C,D,mod,n六個正整數。 題目是這樣的:
 

 

現在小愛同學想計算出 G(n)G(n) 的值(G(n)為F(n)的前n項積),並用該值作為密碼鎖的密碼。

由於結果過大,所以答案 G(n)%mod
 

輸入

多組資料。每組包含 6 個整數,分別代表 A, B, C, D, mod, n. (1<=A,B,C,D,mod,n<=1000000000);資料組數不超過 2000.

輸出

輸出 G(n)%mod 的值。

答案保留 9 位有效數字,不足則補 0.

輸入樣例

2 2 2 2 1000 3
7 9 3 4 6 5

輸出樣例

000000064
000000003

 題解


標程











Carryon 數數字
 

Carryon 最近迷上了數數字,然後 Starry 給了他一個區間 [l, r][l,r] ,然後提了幾個要求,

  1. 需要將 ll 到 rr 之間的數全部轉化成 16 進位制,然後連起來。
  2. 將連起來的數又轉化成 10 進位制。
  3. 將最終結果對 15 取模。
     

資料範圍:1 &lt;= l &lt;= r &lt;= 10000000000001<=l<=r<=1000000000000

輸入

單組輸入 ll 和 rr 的值

輸出

輸出最終結果。

輸入樣例

10 14

輸出樣例

0

提示:10、11、12、13、14的16進位制分別是a、b、c、d、e。依次連在一起是abcde,轉換成10進位制是703710,對15取模為0。



題解:




標程


 

Logic Gatekeeper
描述
 

boshi是Rayment的好朋友。

Rayment最近迷上了一個叫Just Shapes & Beats的音遊,於是就推薦給了boshi(網易雲上也有這個遊戲部分音樂的歌單)。可boshi有點著迷於遊戲音樂難以集中精神,有時反應慢了半拍,導致他在第二關就掛了一回。忍無可忍的boshi摘下了耳機,他決定用個更科學的方法來通過這一關。

這首歌的名字就叫做Logic Gatekeeper。如果想的話,你也可以一邊聽歌一邊切這道題目。

遊戲的不同關卡攻擊方式都不一樣,但這關的攻擊方式比較簡單。形式化地來說,攻擊可以被具象化為對一個矩陣的攻擊,也就是說如果你待在這個矩陣的範圍內,你就會受到1的攻擊。

遊戲介面可以認為是一個n×m的矩陣,而遊戲角色恰好佔一個方格的位置。boshi會進行不斷地進行預測某個子矩陣的攻擊概率升高或降低了一定數值,同時為了評估某一個子矩陣的安全性,他也要知道如果他隨機待在子矩陣內的一個位置,受到攻擊的期望是多少。當然,初始時整個遊戲介面任意一個位置的攻擊概率為0

為了避免小數產生的誤差,boshi給出的所有的概率都是在模998244353998244353意義下的值,因此你在輸出期望的時候也應該對998244353998244353取模。

Rayment聽得腦袋都暈了,boshi只好請你來幫他過了這關,不受一點攻擊才能拿到S評定。
輸入
 

第一行三個整數n,m,q,含義同題目描述。

接下來q行有兩種格式,如下:

  • 1 a b c d k,含義是以(a,b)為左下角,(c,d)為右上角的子矩陣的攻擊概率均加上k
  • 2 a b c d,含義是詢問以(a,b)為左下角,(c,d)為右上角的子矩陣的攻擊期望

資料有梯度,且對於100\%100%的資料保證滿足:


輸出
對於每一個2操作,輸出一行一個整數,表示相應的答案。
輸入樣例
 

4 4 3
1 1 1 3 3 4
1 2 3 4 4 5
2 2 2 3 3

輸出樣例

499122183


標程一
#include <algorithm>
#include <cstdio>
#define rg register
#define lowbit(x) ((x)&(-(x)))
using namespace std;
typedef long long ll;
const int maxn=1000010,maxm=100010,mod=998244353;
template <typename Tp> inline void getmin(Tp &x,Tp y){if(y<x) x=y;}
template <typename Tp> inline void getmax(Tp &x,Tp y){if(y>x) x=y;}
template <typename Tp> inline void read(Tp &x)
{
x=0;int f=0;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(f) x=-x;
}
struct data{
int tp,t,x,y,id,y2;
bool operator < (const data &p){return x<p.x;}
}q[maxm<<2],tmp[maxm<<2];
int n,m,k,tot,qc,top,ans[maxm],res[maxm],id[maxm<<2];
inline int pls(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int dec(int x,int y){return x-y<0?x-y+mod:x-y;}
struct BIT{
int a[maxn],a2[maxn];
void add(int p,int v)
{
for(int i=p;i<=m;i+=lowbit(i))
a[i]=pls(a[i],v),a2[i]=pls(a2[i],(ll)p*v%mod);
}
int query(int p)
{
int res=0;
for(int i=p;i;i-=lowbit(i)) res=pls(res,dec((ll)(p+1)*a[i]%mod,a2[i]));
return res;
}
}a,b;
int power(int x,int y)
{
int res=1;
for(;y;y>>=1,x=(ll)x*x%mod)
if(y&1)
res=(ll)res*x%mod;
return res;
}
void input()
{
int op,x,y,s,t,val;
read(n);read(m);read(k);m++;tot=k<<1;
for(rg int i=1;i<=k;i++)
{
read(op);read(x);read(y);read(s);read(t);
x++;y++;s++;t++;
if(op==1)
{
read(val);
q[(i<<1)-1]=(data){0,i,s,t,val,y};
q[i<<1]=(data){0,i,x-1,t,mod-val,y};
}
else
{
q[(i<<1)-1]=(data){1,i,s,t,++qc,y};
q[i<<1]=(data){2,i,x-1,t,qc,y};
res[qc]=power((ll)(s-x+1)*(t-y+1)%mod,mod-2);
}
}
sort(q+1,q+tot+1);
}
void cdq(const int &l,const int &r)
{
int mid=(l+r)>>1;
if(l<mid) cdq(l,mid);
if(mid+1<r) cdq(mid+1,r);
rg int i=l,j=mid+1;top=0;
while(i<=mid&&j<=r)
{
if(q[i].t<=q[j].t) tmp[++top]=q[i++],id[top]=0;
else tmp[++top]=q[j++],id[top]=1;
}
while(i<=mid) tmp[++top]=q[i++],id[top]=0;
while(j<=r) tmp[++top]=q[j++],id[top]=1;
for(i=1;i<=top;i++)
{
if(id[i])//r
{
if(tmp[i].tp==1)
ans[tmp[i].id]=pls(ans[tmp[i].id],dec(a.query(tmp[i].y),a.query(tmp[i].y2-
1)));
else if(tmp[i].tp==2)
ans[tmp[i].id]=dec(ans[tmp[i].id],dec(a.query(tmp[i].y),a.query(tmp[i].y2-
1)));
else b.add(tmp[i].y2,tmp[i].id),b.add(tmp[i].y+1,mod-tmp[i].id);
}
else{
if(tmp[i].tp==1)
ans[tmp[i].id]=pls(ans[tmp[i].id],
(ll)tmp[i].x*dec(b.query(tmp[i].y),b.query(tmp[i].y2-1))%mod);
else if(tmp[i].tp==2)
ans[tmp[i].id]=dec(ans[tmp[i].id],
(ll)tmp[i].x*dec(b.query(tmp[i].y),b.query(tmp[i].y2-1))%mod);
else a.add(tmp[i].y2,(ll)tmp[i].id*tmp[i].x%mod),a.add(tmp[i].y+1,(ll)(modtmp[
i].id)*tmp[i].x%mod);
}
}
for(i=1;i<=top;i++)
{
if(!tmp[i].tp){
if(id[i]) b.add(tmp[i].y2,mod-tmp[i].id),b.add(tmp[i].y+1,tmp[i].id);
else a.add(tmp[i].y2,mod-(ll)tmp[i].id*tmp[i].x%mod),a.add(tmp[i].y+1,
(ll)tmp[i].id*tmp[i].x%mod);
}
q[l+i-1]=tmp[i];
}
}
int main()
{
input();
cdq(1,tot);
for(rg int i=1;i<=qc;i++) printf("%lld\n",(ll)ans[i]*res[i]%mod);
return 0;
}

相關文章