1. 程式人生 > >哈爾濱理工大學第七屆程序設計競賽決賽(網絡賽-高年級組)A - 所有情況的和

哈爾濱理工大學第七屆程序設計競賽決賽(網絡賽-高年級組)A - 所有情況的和

mod 測試數據 理工大學 網絡賽 種類 -c spa amp 決定

題目描述

在acimo星球, tabris 是一名勇敢的屠龍勇士,在上綠島屠龍前決定挑選N種裝備武裝自己,現在每種裝備有兩個,**但每種裝備tabris必須選擇拿一個**,**不能多也不能少**。
每件裝備有自己的屬性值,能給tabris屬性加成。
對於不同種類的裝備之間有疊加效果,如果選擇多件裝備,最終的屬性加成為他們的乘積。
若tabris初始屬性值為0,最後屬性加成的期望是多少。

輸入描述:

有多組測試樣例,輸入到文件結束。
每組測試數據的第一行包含一個正整數NN,表示裝備的種類數。
接下來N行,每行兩個正整數ai、bi,表示兩個不同的第ii種裝備的屬性加成值。

N∈[1,103]

ai,bi∈[1,106]

輸出描述:

對於每組測試數據輸出一個整數,為了方便輸出最終的結果先乘2N再對1e9+7取模後的值。
示例1

輸入

4
1 2
3 4
5 6
7 8

輸出

3465

說明

3465 = (1*3*5*7) + (1*3*5*8) +(1*3*6*7) + (1*3*6*8) + (1*4*5*7) + (1*4*5*8) + (1*4*6*7) + (1*4*6*8) + (2*3*5*7) + (2*3*5*8) + (2*3*6*7) + (2*3*6*8) + (2*4*5*7) + (2*4*5*8) + (2*4*6*7) + (2*4*6*8) ;

題解

$dp$。

通過稍微簡單的分析就可以知道是一個簡單的$dp$。

#include <bits/stdc++.h>
using namespace std;
 
const int maxn = 1000 + 10;
int T, n;
long long mod = 1e9 + 7;
long long ans;
long long a[maxn], b[maxn];
 
int main() {
  while(~scanf("%d", &n)) {
    for(int i = 1; i <= n; i ++) {
      scanf("%lld%lld", &a[i], &b[i]);
    }
    for(int i = 2; i <= n; i ++) {
      long long sum = a[i - 1] + b[i - 1];
      sum = sum % mod;
      a[i] = a[i] * sum % mod;
      b[i] = b[i] * sum % mod;
    }
    long long ans = (a[n] + b[n]) % mod;
    printf("%lld\n", ans);
  }
  return 0;
}

  

哈爾濱理工大學第七屆程序設計競賽決賽(網絡賽-高年級組)A - 所有情況的和