某不知出處的題,字首和字尾和預處理

2022-01-19 21:03:59 字數 1204 閱讀 5780

description:

給出數列a1,a2,...,an,並設

bi = (a1 * a2 * a3 ... an) / ai mod (109 + 7)

現要求把所有的bi 算出來

input:

輸入包含多組測試資料。對於每組資料,第1 行,1 個整數n(1 ≤n ≤100,000), 表示數列的長度。第2

行,n 個整數a1,a2,...,an(1 ≤ai≤109),表示給出的數列。輸入以乙個 0 表示結尾。

output:

對於每組資料,輸出一行,n 個整數用空格分隔,表示算出的b1,b2,...,bn。

sample input:

1 2 3

sample output:

解析:看資料,ai過大,直接乘就溢位了。使用(a*b)%c==(a%c*b%c)%c。我們可以直接這麼處理,乘起來。但問題是,對於乘法,有模分配律,但是除法沒有。那麼問題來了,對於題意來講,bi=(a1*a2....*an)/ai mod,來講,直接乘的時候不算ai,約掉不就好了?不行,因為n的資料,n*n不行。所以引入字首積和字尾積來處理。舉個例子,b2=(a1*a2*a3*a4)/a2  %mod。。

原式就是b2=(a1*a3*a4)%mod==(a1%mod*(a3*a4)%mod)%mod。這裡的a1,是i=2往前的字首積,a3*a4是i=2之後的字尾積。那麼顯而易見,字首和與字尾和在這裡面處理的很巧妙。

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=1e5+10

;const

int mod=1000000007

;ll a[maxn],l[maxn],r[maxn];

intmain()

l[0]=1

; r[n+1]=1

;

for(int i=1;i<=n;i++)

l[i]=(a[i]*l[i-1])%mod;

for(int i=n;i>=1;i--)

r[i]=(a[i]*r[i+1])%mod;

for(int i=1;i<=n;i++)

}}

遞增的字首和字尾的區別

字首 出現在其作用的變數前 字尾 出現在其作用的變數後 從下面的結果可以看出對輸出沒有影響,效果等同於 super super 1 ultra ultra 1 include intmain void getchar return0 輸出顯示結果 super 1,ultra 1 super 2,ul...

關於英語字首和字尾的區別

典型的前字尾應用舉例 1 excite vt.刺激 exciting adj.令人興奮的 excited adj.感到興奮的 excitement n.興奮 2 smile v.n.微笑 smiling adj.微笑的 smilingly adv.微笑的 unsmiling adj.不笑的 字首改變...

C C 數字常量的字首和與字尾

c c 中,我們經常會用到諸如0x100 100 0b1101這類的數字常量,這裡的0x 0b就是數字常量的字首,分別表示此數字是十六進製制和二進位制。100 不加任何字首,表示十進位制數。我們有時候也會見到一些諸如 0x1fffful 0x1ffffull 0x1ffffll 1.8f之類的數字字...