試題 演算法提高 翔集合

2021-10-06 06:19:10 字數 1211 閱讀 1223

問題描述

集合m至少有兩個元素(實數),且m中任意兩個元素差的絕對值都大於2,則稱m為「翔集合」,已知集合s=,請求出n的子集中共有多少個翔集合。

輸入格式

輸入共一行,乙個整數n.(n>=2)

輸出格式

輸出共一行,乙個整數表示s的子集中共有多少個翔集合,由於個數可能過大,請輸出這個值除以1000007的餘數。

樣例輸入

4樣例輸出

1資料規模和約定

對於20%的資料,2<=n<=1000000

對於100%的資料,2<=n<=10^15

本題需要矩陣乘法求解。我們假設an為最大數為n時包含所有翔集合的總數,分析他的組成,可以由含有n和不含有n的翔集合相加。

1,不含有n的翔集合總數顯然為an-1。

2,而含有n的如何分析呢,我們可以這樣想,因為翔集合每個元素之間的差的絕對值大於2,所以我們可以在最大數為n-3時構成的每乙個翔集合中後面都加乙個n,但是由於翔集合中元素數量最少為2,這樣構成後,顯然只包含了3個及以上的含n的翔集合an-3。

3,單獨分析含n的二元翔集合,很簡單為n-3個,即n與不大於n-3的數構成的二元集,

綜上得出通項:an = an-1+an-3+(n-3)

滾動陣列或矩陣乘法求出即可。

得出通項後可構造矩陣

//矩陣快速冪實現翔集合 

#include

#include

#include

using

namespace std;

typedef

long

long ll;

struct node

}x,y;

ll n;

void

set(

)struct node mul

(node tmp1,node tmp2)}}

return t***;

}struct node quick2_pow

(ll k)

return ans;

}int

main()

node s;

s =mul(

quick2_pow

(n-4

),y)

;printf

("%lld\n"

,s.a[0]

[0]%

1000007);

}

C 演算法提高 翔集合

題目閱覽 集合m至少有兩個元素 實數 且m中任意兩個元素差的絕對值都大於2,則稱m為 翔集合 已知集合s 請求出n的子集中共有多少個翔集合。輸入格式 輸入共一行,乙個整數n.n 2 輸出格式 輸出共一行,乙個整數表示s的子集中共有多少個翔集合,由於個數可能過大,請輸出這個值除以1000007的餘數。...

試題 演算法提高 斷案

問題描述 公安人員審問甲 乙 丙 丁四個嫌疑犯,已確知,這四個人當中僅有一人是偷竊者,還知道這四個人的答話,要麼完全誠實,要麼完全說謊。在回答公安人員的問話中 甲說 乙沒有偷,是丁偷的。乙說 我沒有偷,是丙偷的。丙說 甲沒有偷,是乙偷的。丁說 我沒有偷,我用的那東西是我家裡的。請根據上述四人答話,判...

試題 演算法提高 vertex cover dfs

問題描述 給定乙個n個點m條邊的無向圖g 點的編號從1至n 問是否存在乙個不超過k個點的集合s,使得g中的每條邊都至少有乙個點在集合s中。輸入格式 輸入的第一行包含乙個整數t,表示資料的組數。接下來t組資料中 每組輸入的第一行包含三個整數n,m,k,分別表示圖的點數,邊數,集合點數的最大值。接下來m...