Description
给出数列A1,A2 ,...,AN,并设
现要求把所有的Bi 算出来。
Input
输入包含多组测试数据。对于每组数据,第1 行,1 个整数N(1 ≤N≤100,000), 表示数
列的长度。第2 行,N 个整数A1,A2,...,AN(1 ≤Ai≤109),表示给出的数列。输入以一个0 表
示结尾。
Output
给出数列A1,A2 ,...,AN,并设
现要求把所有的Bi 算出来。
Input
输入包含多组测试数据。对于每组数据,第1 行,1 个整数N(1 ≤N≤100,000), 表示数
列的长度。第2 行,N 个整数A1,A2,...,AN(1 ≤Ai≤109),表示给出的数列。输入以一个0 表
示结尾。
Output
对于每组数据,输出一行,N 个整数用空格分隔,表示算出的B1,B2,...,BN。
这道题其实很简单的
这道题可以用打表来解决,还有一种方法就是求逆元素
打表打出1个数到第i个数的积,从第n个数向前到第j个数的乘积
然后具体实现,看代码吧:
#include <cstdio>
#include <cstring>
const long long mod = 1000000007;
const int N = 100010;
int n;
long long a[N], b[N], num[N];
int main()
{
while ( scanf("%d", &n) != EOF && n ) {
int x;
for ( int i = 0; i < n; ++i ) {
scanf("%d", &x);
num[i] = x % mod;
}
a[0] = num[0], b[n-1] = num[n-1];
for ( int i = 1, j = n-2; i < n && j >= 0; ++i, --j ) {
a[i] = (a[i-1]*num[i]) % mod;
b[j] = (b[j+1]*num[j]) % mod;
}
printf("%lld", b[1] );
for ( int i = 1; i < n-1; ++i ) {
printf(" %lld", a[i-1]*b[i+1]%mod );
}
printf(" %lld\n", a[n-2]);
}
}