P2220 HAOI2012 容易題 快速冪

2022-02-02 05:57:35 字數 1471 閱讀 4628

為了使得大家高興,小q特意出個自認為的簡單題(easy)來滿足大家,這道簡單題是描述如下:

有乙個數列a已知對於所有的a[i]都是1~n的自然數,並且知道對於一些a[i]不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的值,是不是很簡單呢?呵呵!

第一行三個整數n,m,k分別表示數列元素的取值範圍,數列元素個數,以及已知的限制條數。

接下來k行,每行兩個正整數x,y表示a[x]的值不能是y。

一行乙個整數表示所有可能的數列的積的和對1000000007取模後的結果。如果乙個合法的數列都沒有,答案輸出0。

輸入 #1複製

3 4 5

1 11 1

2 22 3

4 3

輸出 #1複製

90

樣例解釋

a[1]不能取1

a[2]不能去2、3

a[4]不能取3

所以可能的數列有以下12種

數列 積

2 1 1 1 2

2 1 1 2 4

2 1 2 1 4

2 1 2 2 8

2 1 3 1 6

2 1 3 2 12

3 1 1 1 3

3 1 1 2 6

3 1 2 1 6

3 1 2 2 12

3 1 3 1 9

3 1 3 2 18

30%的資料n<=4,m<=10,k<=10

另有20%的資料k=0

70%的資料n<=1000,m<=1000,k<=1000

100%的資料 n<=10^9,m<=10^9,k<=10^5,1<=y<=n,1<=x<=m

這個題就是把所有數加起來乘方,用一下求和公式就行

因為有限制,所以減去限制的值,乘方上邊減去有限制的個數。

最後把他們乘在一起就行。因為資料大,所以用快速冪優化。

#includeusing

namespace

std;

typedef

long

long

ll;const ll mod=1000000007

;const

int maxn=1e5+3

;map

,bool>inf;

mapsum;

ll n,m,k,js,num[maxn];

ll pow(ll a,ll x)

return ans%mod;

}int

main()

ll ans=1,max=(n+1)*n/2

;

for(ll i=1;i<=js;i++)

printf(

"%lld

",ans%mod*pow(max,m-js)%mod%mod);

return0;

}

P2220 HAOI2012 容易題 小學數學

有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的值,是不是很簡單呢?呵呵!標籤裡面數論是騙人的 霧 難道是因為有個取模嗎?這題還是很簡單的,首先觀察...

洛谷 2220 HAOI2012 容易題

題目描述 為了使得大家高興,小q特意出個自認為的簡單題 easy 來滿足大家,這道簡單題是描述如下 有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的...

數論 HAOI2012 容易題

問題描述 為了使得大家高興,小q特意出個自認為的簡單題 easy 來滿足大家,這道簡單題是描述如下 有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的...