暑期第一次多校联合赛 I题 数学题
2012-09-14 17:20
239 查看
Problem I. 数学
Time Limit: 1000ms Memory Limit: 65536kb
Description
给出数列A1;A2; : : : ;AN,并设
Bi = (A1 * A2 * 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 OUTPUT
31
2 3
0
6 3 2
题目大意:求出Bi。
思路:
由于数据量大,无法枚举,我是通过在线打表来做的,打表的时候小小的利用的DP的思想,就是利用前一项得出当前一项,具体打表就是把每一个Ai的左右边分别打出表来,第一个数组ee保存的是A1%x,A1*A2%x,A1*A2*A3%x,……来得出,而re就是反过来保存。而在求出Bi的时候的映射关系是:第一项和最后一项特殊处理(所以n==1的时候要特殊处理), Bi=ee [i-1] *re[(n-1)-(i+1)] ,假如现在求B3的话,那么左边就是存在ee[I-1],而右边就是:如果按正序的话,就是re【i+1】,但是因为我反过来存了,所以就是用re【n-1-(i+1)】把他扭过来的那种感觉。
A0*A1*A2*A3*A4*A5
A5*A4*A3*A2*A1*A0
program:
Time Limit: 1000ms Memory Limit: 65536kb
Description
给出数列A1;A2; : : : ;AN,并设
Bi = (A1 * A2 * 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 OUTPUT
31
2 3
0
6 3 2
题目大意:求出Bi。
思路:
由于数据量大,无法枚举,我是通过在线打表来做的,打表的时候小小的利用的DP的思想,就是利用前一项得出当前一项,具体打表就是把每一个Ai的左右边分别打出表来,第一个数组ee保存的是A1%x,A1*A2%x,A1*A2*A3%x,……来得出,而re就是反过来保存。而在求出Bi的时候的映射关系是:第一项和最后一项特殊处理(所以n==1的时候要特殊处理), Bi=ee [i-1] *re[(n-1)-(i+1)] ,假如现在求B3的话,那么左边就是存在ee[I-1],而右边就是:如果按正序的话,就是re【i+1】,但是因为我反过来存了,所以就是用re【n-1-(i+1)】把他扭过来的那种感觉。
A0*A1*A2*A3*A4*A5
A5*A4*A3*A2*A1*A0
program:
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<time.h> using namespace std; #define ww 1000000007 __int64 mm[100005]; __int64 remm[100005]; int ee[100005];//数组正向,计算反向 int re[100005];//数组逆向,计算正向 int bb[100005]; int main() { int n; while(scanf("%d",&n)!=EOF,n) { memset(mm,0,sizeof(mm)); memset(ee,0,sizeof(ee)); memset(re,0,sizeof(re)); memset(remm,0,sizeof(remm)); for(int i=0;i<n;i++) { scanf("%I64d",&mm[i]); } if(n==1) { printf("1\n"); continue; } for(int i=n-1,tmp=0;i>=0;i--,tmp++) { remm[tmp]=mm[i]; } ee[0]=mm[0]%ww; for(int i=1;i<n-1;i++) { ee[i]=( ee[i-1] *( mm[i]% ww ) )%ww; } //下面这个全部拷贝上面 re[0]=remm[0]%ww; //cout<<"i ee[0] "<<' '<<re[0]<<endl; for(int i=1;i<n-1;i++) { re[i]=( re[i-1] *( remm[i]% ww ) )%ww; //cout<<"i re[i] "<<i<<' '<<re[i]<<' '; } bb[0]=re[n-2]; bb[n-1]=ee[n-2]; for(int i=1;i<n-1;i++) { bb[i]=( ee[i-1] * re[(n-1)-(i+1)] )%ww; } printf("%d",bb[0]); for(int i=1;i<n;i++) printf(" %d",bb[i]); printf("\n"); } return 0;}
相关文章推荐
- HDU 5734 Acperience(数学推导【多校联合】)
- 2009ACM多校联合暑期集训(5)——国防科大专场
- [数学]多校联合第三场 hdu5317 RGCDQ
- 暑期多校联合比赛F题 8_24 杨辉三角的打印
- 2013暑期多校联合训练\第三场\Problem H
- hdu 4562 Dice 求期望 推数学公式 (2013多校联合)
- 2013暑期多校联合训练\第四场\Problem H Hehe
- [数学] 多校联合第五场 hdu5344 MZL's xor
- 2013暑期多校联合训练\第五场 Problem F Magic Pen 6
- 暑期多校联合比赛 8-24 K次方
- 2013暑期多校联合训练\第三场\Problem G
- HDU 4643 GSM 暑期多校联合训练第五场 1001
- 对于第一次多校大一联合赛的感想
- 暑期多校联合第一题,hdu4861
- HDU 4643 GSM 暑期多校联合训练第五场 1001
- 多校联合第一场 数学
- 2009ACM多校联合暑期集训(2)——TJU专场
- HDU 3521 2010多校联合第9场 数学
- 暑期多校联合第一场 H题 俄罗斯方块 (整理暑期题目系列)
- HDU 5402 Travelling Salesman Problem (2015 Multi-University Training Contest 9 2015多校联合)