問題描述
集合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...