前缀积和后缀积

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:

3

1 2 3

0

Sample Output:

6

3

2

题意并不难懂

题目给的数据很大,如果一直乘下去,肯定会溢出。所以这里用了一个取余的分配律(a*b)%c=(a%c*b%c)%c

但是这只能得到A1*A2......An,因为取余在除法中没有分配率,所以这里就利用了前缀积和后缀积来解决这个问题。

即:假如n=2,Bi=(A1*A2*A3*A4*A5)%Ai => pre[i]=A1%1000000007 suff[i]=(A3*A4*A5)%1000000007 Bi=pre[i]*suff[i]

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 using namespace std;
 5 long long a[100010],pre[100010],suff[100010];
 6 const int mod=1000000007;
 7 int main()
 8 {
 9     int n,i;
10     while(scanf("%d",&n)&&n)
11     {
12         memset(a,0,sizeof(a));
13         for(i=1;i<=n;i++)
14             scanf("%lld",&a[i]);
15         pre[0]=1;
16         for(i=1;i<=n;i++)
17             pre[i]=(pre[i-1]*a[i])%mod;
18         suff[n+1]=1;
19         for(i=n;i>=1;i--)
20             suff[i]=(suff[i+1]*a[i])%mod;
21         for(i=1;i<=n;i++)
22             printf("%lld%c",(pre[i-1]*suff[i+1])%mod,i==n?‘\n‘:‘ ‘);
23     }
24     return 0;
25 }

前缀积和后缀积

时间: 2024-08-29 13:30:30

前缀积和后缀积的相关文章

自增、自减运算符的前缀和后缀

试卷中有这么一道题目: 1 2 int a = 4; (++a) += i; 求a的数值,正确答案是10. 如果你认为这道题重点只是考察运算符优先级,可能很容易得到正确的答案. 但是,考虑过为什么下面的代码无法编译么? 自己在笔试时,考虑到了关于表达式作为赋值运算符左值的问题,但是自己确实又对重载"++"操作符的实现机制和函数原型不很了解,就误认为"a++"和"++a"这两种写法都不能作为赋值运算符左值,从而以为这道题出错了,或者故意考察这一点,

c++前缀和后缀++

1,c++规定后缀形式的++操作符有一个int行的参数,被调用时,编译器自动加一个0作为参数给他 2,前缀返回一个reference,后缀返回一个const对象 /////////////////////////////////////////////////////////////////////////////// // // FileName : meffect_item5.h // Version : 0.10 // Author : Ryan Han // Date : 2013/11

递归算法(二)&mdash;&mdash;前缀转后缀

源码:pretopost.cpp #include "stdafx.h" #include <stdio.h> #include <stack> /************************************************************************/ /* 前缀转后缀 */ /************************************************************************

字符串前缀,真前缀,后缀,真后缀,及前缀函数

举个例子,如字符串 ababc 首先,不考虑空字符,所有的前缀有a, ab, aba, abab, ababc,其中真前缀有a, ab, aba, abab 同理可以理解后缀,真前(后)缀就是指不包含自身的前(后)缀 前缀函数next[j]是指某个字符串的最长真后缀同时也是它的前缀的子串长度.不太理解可以看下面的例子 a -> 0 ab -> 0 aba -> 1 abab -> 2 ababc -> 0 前缀函数在字符串的匹配中用的较多,如KMP等.它主要是表明在一次匹配失

中缀、前缀、后缀表达式的转换

中缀表达式:a+b*c-(d+e) 第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e)) 第二步:转换前缀与后缀表达式 前缀(波兰式):把运算符号移动到对应的括号前面 则变成了:-( +(a *(bc)) +(de)) 把括号去掉:-+a*bc+de 前缀式子出现 后缀(逆波兰式):把运算符号移动到对应的括号后面 则变成了:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 后缀式子出现

POJ 2752+KMP+利用next数组性质求出所有相同的前缀和后缀

题目链接:点击进入 这个题目要求所有相同的前缀和后缀的长度.我们可以利用KMP算法中next数组的性质,在next[len]这个点不断的失配下去,这样就可以将所有相同的前后缀的长度求出来.还要注意这个中整个串的长度也可以看成是一个合法的解. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=400000+100; char str

将前缀和后缀相同的文件移动到同一个目录的算法设计及C代码实现

一.需求描述 在Linux系统的某几个目录下有一些前缀和后缀相同的文件,编写程序将它们移动到同一个目录下. 例如,有三个源目录FileDir1.FileDir2和FileDir3,里面分别存放有文件File_1.txt.File_2.txt和File_3.txt.由于它们有相同的前缀(File_)和后缀(txt),所以要将这三个文件移动到同一个结果目录(假设为GatherDir)中. 二.算法设计 基于需求,可以采用如图1所示的程序流程: 图1 程序总体流程 三.特殊流程考虑 在编写程序的过程中

中缀、前缀和后缀表达式

我们学习的算法中的表达式有中缀.前缀和后缀之分,到底有什么区别呢? 中缀(INFIX) 中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符. AA + B(A + B) + (C – D) 前缀(PREFIX) 前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数. A+ A B+ + A B – C D 后缀(POSTFIX) 后缀表达式(postfix expression

关于字符串 “*****AB**C*D*****” 中前缀、后缀和中间 &#39;*&#39; 的处理

一.删除前缀 '*' 1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 //主函数 7 int main() 8 { 9 char chr[20],*b,*p; //字符串缓冲区:字符串头指针:字符串临时指针 10 int chr_num=0,b_num=0; //输入的字符串中字符的个数:输入的字符串中前缀 * 的个数 11 int i; 12 13 //输入 14 cout<<&