壮壮的数组
壮壮的数组
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 31 Accepted Submission(s) : 13
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
A,B,C为三个元素个数为n的数组,A={a1,a2,a3...an},B={b1,b2,b3...bn},C={c1,c2,c3...cn};
已知A、B数组,而且有ci等于ai或bi(1<=i<=n),毫无疑问,C数组有很多种组合。
但是zz不希望C数组全由A数组或者B数组组成,每一种组合都有一个K值,K=c1*c2*c3*...*cn。
现在需要你求出每一种组合对应的K值,并将它们加起来的结果。这个结果可能会很大,请将答案对1e9+7取模。
例如A={1,2,3} B={2,2,4}。
C数组可能为{a1,b2,b3} {b1,a2,b3} {b1,b2,a3} {a1,a2,b3} {a1,b2,a3} {b1,a2,a3}
K值分别为8,16,12,8,6,12,所以你应该输出62。
大量输入,建议使用scanf
已知A、B数组,而且有ci等于ai或bi(1<=i<=n),毫无疑问,C数组有很多种组合。
但是zz不希望C数组全由A数组或者B数组组成,每一种组合都有一个K值,K=c1*c2*c3*...*cn。
现在需要你求出每一种组合对应的K值,并将它们加起来的结果。这个结果可能会很大,请将答案对1e9+7取模。
例如A={1,2,3} B={2,2,4}。
C数组可能为{a1,b2,b3} {b1,a2,b3} {b1,b2,a3} {a1,a2,b3} {a1,b2,a3} {b1,a2,a3}
K值分别为8,16,12,8,6,12,所以你应该输出62。
大量输入,建议使用scanf
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(1<=n<=100000),表示A,B,C数组元素个数,第二行有n个数据表示a1
a2 a3...an,第三行有n个数据表示b1 b2 b3...bn,(1<=ai,bi<=1e9)。处理到文件的结束。
Output
对于每个测试实例,输出一行数据表示问题的答案,请将答案对1e9+7取模。
Sample Input
3 1 2 3 2 2 4 1 3 4
Sample Output
62 0
这题就找规律。
但是挺难找的,耐心啊;
结果就是求(a1+b1)*(a2+b2)*....*(an+bn)-a1*a2...*an-b1*b2*...*bn
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define ll long long int 6 #define M 100005 7 #define Mod 1000000007 8 #define mem(a) memset(a,0,sizeof(a)) 9 using namespace std; 10 ll a[M],b[M],c[M]; 11 int main(){ 12 int n; 13 while(scanf("%d",&n)!=EOF){ 14 ll sum,cnt,ans; 15 sum=cnt=1; 16 ans=1; 17 for(int i=0;i<n;i++){ 18 scanf("%lld",&a[i]); 19 sum=(sum*a[i])%Mod; 20 c[i]=a[i]; 21 } 22 for(int i=0;i<n;i++){ 23 scanf("%lld",&b[i]); 24 cnt=(cnt*b[i])%Mod; 25 c[i]+=b[i]; 26 } 27 for(int i=0;i<n;i++){ 28 ans=(c[i]*ans)%Mod; 29 } 30 printf("%lld\n",(ans-cnt-sum+Mod+Mod)%Mod); 31 mem(a); 32 mem(b); 33 mem(c); 34 } 35 return 0; 36 }