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之類的數字字...