1. 程式人生 > >JXNU acm選拔賽 壯壯的數組

JXNU acm選拔賽 壯壯的數組

ssi -a ... names amp scan miss time 文件

壯壯的數組

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 18 Accepted Submission(s) : 8

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

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

解題思路:這是個數學題,分析可以知道這麽個式子。
K=(a[1]+b[1])*(a[2]+b[2])*...*(a[n]+b[n]) - a[1]*a[2]*...*a[n] - b[1]*b[2]*...*b[n];

因為數據會很大所以對1e9+7取余。
ps:這題我猜是數學,但是無奈推不出式子。。。
代碼:



 1 #include<iostream>
 2 #include<stdio.h>
 3 using namespace std;
 4 int a[100005],b[100005];
 5 long long INF=1e9+7;
 6 int main()
 7 {
 8     int n;
 9     while(~scanf("%d",&n)){
10         for(int i=1;i<=n;i++)
11             scanf("%d",&a[i]);
12 for(int i=1;i<=n;i++) 13 scanf("%d",&b[i]); 14 long long ans=1,cnt=1,sum=1; 15 for(int i=1;i<=n;i++){ 16 ans*=a[i]; 17 ans%=INF; 18 } 19 for(int i=1;i<=n;i++){ 20 cnt*=b[i]; 21 cnt%=INF; 22 } 23 for(int i=1;i<=n;i++){ 24 sum*=(a[i]+b[i]); 25 sum%=INF; 26 } 27 sum=(sum+INF-ans+INF-cnt)%INF; 28 cout<<sum<<endl; 29 } 30 return 0; 31 }



JXNU acm選拔賽 壯壯的數組