小a的旅行计划(组合数学与逆元)

  • 注释: ( a + b ) n = ∑ i = 0 n a i b n − i C n i \small (a+b)^n=\large\sum\limits_{i=0}^{n}\small a^ib^{n-i}C_n^i (a+b)n=i=0naibniCni,本章用到 {   a = 1   b = 1 \small\begin{cases} \ a=1\\ \ b=1\\ \end{cases} {  a=1 b=1 {   a = 2   b = 1 \small\begin{cases} \ a=2\\ \ b=1\\ \end{cases} {  a=2 b=1 {   a = 1   b = 2 \small\begin{cases} \ a=1\\ \ b=2\\ \end{cases} {  a=1 b=2的特殊情况
  • 题面
  • 题意:见题面。
  • 解决思路:由题意不难看出集合 A , B \small A,B A,B的个数都不能为 1 \small 1 1 n \small n n ( 1 , n \small (1,n (1,n的时候肯定相互包含 ) \small ) )
    直接枚举加推导就好
    考虑 A \small A A,先从 n \small n n个景点挑出 i \small i i个,即: ∑ i = 2 n − 1 C n i \large\sum\limits_{i=2}^{n-1}\small C_n^i i=2n1Cni
    再来考虑 B \small B B,为了满足条件,只要 B \small B B A \small A A中挑出大于等于 1 \small 1 1个景点,并且在 A \small A A的补集中挑出大于等于 1 \small 1 1个景点即可。
    注意: B \small B B不能把 A \small A A中所有的元素挑出,不然会包含的。
    B \small B B A \small A A中: ∑ j = 1 i − 1 C i j \large\sum\limits_{j=1}^{i-1}\small C_i^{j} j=1i1Cij
    B \small B B A \small A A的补集中: ∑ k = 1 n − i C n − i k \large\sum\limits_{k=1}^{n-i}\small C_{n-i}^{k} k=1niCnik
    推导
    ∴ ∑ i = 2 n − 1 C n i ∑ j = 1 i − 1 C i j ∑ k = 1 n − i C n − i k \small\therefore\large\sum\limits_{i=2}^{n-1}\small C_n^i\large\sum\limits_{j=1}^{i-1}\small C_i^{j}\large\sum\limits_{k=1}^{n-i}\small C_{n-i}^{k} i=2n1Cnij=1i1Cijk=1niCnik
    = ∑ i = 2 n − 1 C n i ∑ j = 1 i − 1 C i j ( ∑ k = 0 n − i C n − i k − C n − i 0 ) \small=\large\sum\limits_{i=2}^{n-1}\small C_n^i\large\sum\limits_{j=1}^{i-1}\small C_i^{j}\small(\large\sum\limits_{k=0}^{n-i}\small C_{n-i}^{k}-C_{n-i}^0) =i=2n1Cnij=1i1Cij(k=0niCnikCni0)
    = ∑ i = 2 n − 1 C n i ∑ j = 1 i − 1 C i j ( 2 n − i − 1 ) \small=\large\sum\limits_{i=2}^{n-1}\small C_n^i\large\sum\limits_{j=1}^{i-1}\small C_i^{j}\small(2^{n-i}-1) =i=2n1Cnij=1i1Cij(2ni1)
    = ∑ i = 2 n − 1 C n i ( ∑ j = 0 i C i j − C i 0 − C i i ) ( 2 n − i − 1 ) \small=\large\sum\limits_{i=2}^{n-1}\small C_n^i\small(\large\sum\limits_{j=0}^{i}\small C_i^{j}-C_i^0-C_i^i)\small(2^{n-i}-1) =i=2n1Cni(j=0iCijCi0Cii)(2ni1)
    = ∑ i = 2 n − 1 C n i ( 2 i − 2 ) ( 2 n − i − 1 ) \small=\large\sum\limits_{i=2}^{n-1}\small C_n^i\small(2^i-2)\small(2^{n-i}-1) =i=2n1Cni(2i2)(2ni1)
    = ∑ i = 2 n − 1 C n i ( 2 n − 2 i − 2 × 2 n − i + 2 ) \small=\large\sum\limits_{i=2}^{n-1}\small C_n^i\small(2^n-2^i-2\times2^{n-i}+2) =i=2n1Cni(2n2i2×2ni+2)
    = ∑ i = 2 n − 1 C n i ( 2 n + 2 − 2 i − 2 × 2 n − i ) \small=\large\sum\limits_{i=2}^{n-1}\small C_n^i\small(2^n+2-2^i-2\times2^{n-i}) =i=2n1Cni(2n+22i2×2ni)
    = ( 2 n + 2 ) ∑ i = 2 n − 1 C n i − ∑ i = 2 n − 1 2 i C n i − 2 ∑ i = 2 n − 1 2 n − i C n i \small=\small(2^n+2)\large\sum\limits_{i=2}^{n-1}\small C_n^i-\large\sum\limits_{i=2}^{n-1}\small2^i\small C_n^i-2\large\sum\limits_{i=2}^{n-1}\small2^{n-i}\small C_n^i =(2n+2)i=2n1Cnii=2n12iCni2i=2n12niCni
    = ( 2 n + 2 ) ( ∑ i = 0 n C n i − C n 0 − C n 1 − C n n ) − ( ∑ i = 0 n 2 i C n i − 2 0 C n 0 − 2 1 C n 1 − 2 n C n n ) − 2 ( ∑ i = 0 n 2 n − i C n i − 2 n C n 0 − 2 n − 1 C n 1 − 2 0 C n n ) \small=\small(2^n+2)(\large\sum\limits_{i=0}^{n}\small C_n^i-C_n^0-C_n^1-C_n^n)-(\large\sum\limits_{i=0}^{n}\small2^i\small C_n^i-2^0C_n^0-2^1C_n^1-2^nC_n^n)-2(\large\sum\limits_{i=0}^{n}\small2^{n-i}\small C_n^i-2^nC_n^0-2^{n-1}C_n^1-2^0C_n^n) =(2n+2)(i=0nCniCn0Cn1Cnn)(i=0n2iCni20Cn021Cn12nCnn)2(i=0n2niCni2nCn02n1Cn120Cnn)
    = ( 2 n + 2 ) ( 2 n − n − 2 ) − ( 3 n − 1 − 2 n − 2 n ) − 2 ( 3 n − 2 n − n 2 n − 1 − 1 ) \small=\small(2^n+2)(2^n-n-2)-(3^n-1-2n-2^n)-2(3^n-2^n-n2^{n-1}-1) =(2n+2)(2nn2)(3n12n2n)2(3n2nn2n11)
    = 4 n − 1 − 3 × 3 n + 3 × 2 n \small=\small4^n-1-3\times3^n+3\times 2^n =4n13×3n+3×2n
    由于 ( A , B ) , ( B , A ) \small (A,B),(B,A) (A,B)(B,A)是同一种方案
    ∴ a n s = 4 n − 1 − 3 × 3 n + 3 × 2 n 2 \small \therefore ans\small=\large\frac{4^n-1-3\times3^n+3\times 2^n}{2} ans=24n13×3n+3×2n
         a n s = 4 n − 1 − 3 × 3 n 2 + 3 × 2 n − 1 \small ~~~~ans=\large\frac{4^n-1-3\times3^n}{2}\small+3\times2^{n-1}     ans=24n13×3n+3×2n1
    分母直接快速幂求解逆元就好
  • AC代码
//优化
#pragma GCC optimize(2)
//C
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//C++
#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<istream>
#include<iomanip>
#include<climits>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
//宏定义
#define N 1010
#define DoIdo main
//#define scanf scanf_s
#define it set<ll>::iterator
#define TT template<class T>
//定义+命名空间
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1e8 + 7;
const ll INF = 1e18;
const int maxn = 1e6 + 10;
using namespace std;
//全局变量
//函数区
ll max(ll a, ll b) {
    
     return a > b ? a : b; }
ll min(ll a, ll b) {
    
     return a < b ? a : b; }
ll quick_pow(ll a, ll b) {
    
    
	ll res = 1; a %= mod;
	while (b) {
    
    
		if (b & 1) {
    
    
			res = (res * a) % mod;
		}
		a = (a * a) % mod;
		b >>= 1;
	}
	return res;
}
//主函数
int DoIdo() {
    
    

	ios::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);

	ll n;
	cin >> n;

	ll ans2 = (3 * quick_pow(2, n - 1)) % mod;
	ll ans1 = ((quick_pow(4, n) - 1 - quick_pow(3, n + 1)) % mod + mod) * quick_pow(2, mod - 2);

	cout << (ans1 + ans2) % mod;
	return 0;
}
//分割线---------------------------------QWQ
/*



*/

猜你喜欢

转载自blog.csdn.net/qq_45739057/article/details/106313895