| 孟婆汤 | ||||||
| ||||||
| Description | ||||||
|
男从戎,女守家。一夜,狼烟四起,男战死沙场。从此一道黄泉,两地离别。最后,女终于在等待中老去逝去。逝去的最后是换尽一生等到的相逢和团圆。 某日两人至奈何桥前,服下孟婆汤。 每滴孟婆汤都有强度不一的药效,设一碗孟婆汤共N滴(0<N<100000),其中第i滴(0≤i<N)用b[i]表示。 孟婆汤的药效与原料有关,设熬制前同样有N滴原料,第i滴原料用a[i]表示,0≤a[i]<2^32。 药效b[i]的计算方法为b[i]=(a[0]*a[1]*...*a[N-1]/a[i])%m(假设0/0=1),0<b[i]<2^32。 | ||||||
| Input | ||||||
|
多组输入数据。 每组第一行给出原料数量N,取模数m,紧接着的一行按顺序给出原料a[i]。 | ||||||
| Output | ||||||
|
求出熬制所成每份孟婆汤的药效b[i],每份之间用空格隔开,每组数据之后以换行结尾。 | ||||||
| Sample Input | ||||||
5 11 2 7 5 3 9 3 7 9 8 5 | ||||||
| Sample Output | ||||||
10 6 4 3 1 5 3 2 | ||||||
| Source | ||||||
| 2014 Winter Holiday Contest 2 |
思路:
按照题意模拟。
维护一波前后缀乘积即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll long long int
ll a[100060];
ll pre[100060];
ll back[100060];
int main()
{
ll n,mod;
while(~scanf("%lld%lld",&n,&mod))
{
ll sum=1;
pre[0]=1;
back[n+1]=1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
pre[i]=pre[i-1]*a[i];
pre[i]%=mod;
}
for(int i=n;i>=1;i--)
{
back[i]=back[i+1]*a[i];
back[i]%=mod;
}
for(int i=1;i<=n;i++)
{
if(i==1)
printf("%lld",(back[i+1]*pre[i-1])%mod);
else printf(" %lld",(back[i+1]*pre[i-1])%mod);
}
printf("\n");
}
}


被折叠的 条评论
为什么被折叠?



