容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对
文章目錄
- Co-prime
- source
- solution
- code
- Character Encoding
- source
- solution
- code
- Tree and Constraints
- source
- solution
- code
- 「2017 山東一輪集訓 Day7」逆序對
- source
- solution
- code
Co-prime
source
TTT組數據,給出𝐿,𝑅,𝑁𝐿, 𝑅, 𝑁L,R,N,求在區間[𝐿,𝑅][𝐿, 𝑅][L,R]中有多少個整數與𝑁𝑁N互質
solution
與SCOI2010幸運數字幾乎一樣的解決思路,甚至是弱化版
NNN最多含有111111個質因子
容斥原理
至少含000個NNN的質因子的個數?-?至少含111個NNN?的質因子的個數+++至少含222個NNN?的質因子的個數.........
完全可以dfs搜索是哪些質因子,也就2112^{11}211
code
#include <cstdio> #define int long long int ans, m, l, r; int prime[20];void divide( int n ) {for( int i = 2;i * i <= n;i ++ )if( n % i == 0 ) {prime[++ m] = i;while( n % i == 0 ) n /= i;}if( n > 1 ) prime[++ m] = n; }int calc( int x ) {int L = l / x + ( l % x != 0 ), R = r / x;return R - L + 1; }void dfs( int p, int cnt, int sum ) {if( p > m ) {if( cnt & 1 ) ans -= calc( sum );else ans += calc( sum );return;}dfs( p + 1, cnt, sum );dfs( p + 1, cnt + 1, sum * prime[p] ); }signed main() {int T, n;scanf( "%lld", &T );for( int Case = 1;Case <= T;Case ++ ) {scanf( "%lld %lld %lld", &l, &r, &n );ans = m = 0;divide( n );dfs( 1, 0, 1 );printf( "Case #%lld: %lld\n", Case, ans );}return 0; }Character Encoding
source
TTT組數據
有𝑚𝑚m個數,每個數的取值范圍都是[0,𝑛?1][0, 𝑛?1][0,n?1]?的整數。
求有多少種給這𝑚𝑚m?個數賦值的方案,使得他們的和為𝑘𝑘k
方案數可能很大,請對998244353998244353998244353取模
solution
隔板法
把和為kkk,拆分成kkk個111的盒子,通過m?1m-1m?1塊隔板分割成為mmm個數字
但是隔板法不能有000的情況
就強制每個數字自帶111,也將取值范圍+1+1+1變成[1,n][1,n][1,n],那么最后的和也對應變成k+mk+mk+m
根據隔板法可以得到在無限制的情況下方案數為(m+k?1m?1)\binom{m+k-1}{m-1}(m?1m+k?1?)
容斥原理,強制iii個劃分區域>n>n>n,隔板個數減少i?ni*ni?n
相當于已經有nnn個小球放到某個盒子內,然后把剩下小球放進mmm個盒子里面
code
#include <cstdio> #define mod 998244353 #define int long long #define maxn 200005 int T, n, m, k; int fac[maxn], inv[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }void init( int N ) {fac[0] = inv[0] = 1;for( int i = 1;i <= N;i ++ )fac[i] = fac[i - 1] * i % mod;inv[N] = qkpow( fac[N], mod - 2 );for( int i = N - 1;i;i -- )inv[i] = inv[i + 1] * ( i + 1 ) % mod; }int C( int n, int m ) {if( n < 0 || m < 0 || n < m ) return 0;else return fac[n] * inv[m] % mod * inv[n - m] % mod; }signed main() {init( 2e5 );scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld %lld", &n, &m, &k );int ans = C( m + k - 1, m - 1 );for( int i = 1;i <= m;i ++ )if( i & 1 ) ans = ( ans - C( m, i ) * C( m + k - i * n - 1, m - 1 ) % mod ) % mod;else ans = ( ans + C( m, i ) * C( m + k - i * n - 1, m - 1 ) % mod ) % mod;printf( "%lld\n", ( ans + mod ) % mod );}return 0; }Tree and Constraints
source
給定一個含有𝑛𝑛n個節點的樹,每一條邊可以染成黑色或者白色
有𝑚𝑚m??個限制條件,每一個限制條件包括兩個節點(𝑢,𝑣)(𝑢, 𝑣)(u,v)?,限制為𝑢,𝑣𝑢, 𝑣u,v兩個節點之間的路徑中必須包含至少一個涂成黑色的邊
問有多少種染色方法使得這mmm個條件同時滿足
solution
容斥原理
有iii個限制滿足不了,那么這iii個限制的路徑的交都是白邊,剩下的邊無所謂
n≤50n\le 50n≤50,用long long壓二進制路徑
求個路徑的交
code
#include <cstdio> #include <algorithm> using namespace std; #define int long long #define maxn 55 vector < int > G[maxn]; int path[maxn], limit[maxn];void dfs( int u, int fa, int s ) {path[u] = s;for( auto v : G[u] ) {if( v == fa ) continue;else dfs( v, u, 1ll << v | s );} }signed main() {int n, m;scanf( "%lld", &n );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs( 1, 0, 0 );scanf( "%lld", &m );for( int i = 0, u, v;i < m;i ++ ) {scanf( "%lld %lld", &u, &v );limit[i] = path[u] ^ path[v];}int ans = 0;for( int i = 0;i < ( 1 << m );i ++ ) {int s = 0, cnt = 0;for( int j = 0;j < m;j ++ )if( 1 << j & i ) cnt ++, s |= limit[j];if( cnt & 1 ) ans -= 1ll << n - 1 - __builtin_popcountll( s );elseans += 1ll << n - 1 - __builtin_popcountll( s );}printf( "%lld\n", ans );return 0; }「2017 山東一輪集訓 Day7」逆序對
source
給出𝑛,𝑘𝑛, 𝑘n,k,求有多少個𝑛𝑛n的全排列滿足其逆序對數等于𝑘𝑘k
答案可能很大,請對998244353998244353998244353?取模
solution
按從小到大的順序加入的話,iii?進去可能會造成xi∈[0,i?1]x_i\in[0,i-1]xi?∈[0,i?1]?的貢獻
相當于求∑i=1nxi=k\sum_{i=1}^nx_i=k∑i=1n?xi?=k的多元方程組解個數
類似于第二題,只不過每個數的限制不太一樣
容斥原理
無限制情況下(k+n?1n?1)\binom{k+n-1}{n-1}(n?1k+n?1?)
欽定一些xi≥ix_i\ge ixi?≥i
設限制的xi≥ix_i\ge ixi?≥i的iii之和為sss
隔板法,方案數(k?s+n?1n?1)\binom{k-s+n-1}{n-1}(n?1k?s+n?1?)
容斥系數,限制的個數(?1)m(-1)^m(?1)m
當s>ks>ks>k時對答案無貢獻,只需要計算[1,n][1,n][1,n]中選若干個數,和為s,s∈[1,k]s,s\in[1,k]s,s∈[1,k]??的個數
巧妙的構造方案:
-
每一次給一段數都+1+1+1,或者都+1+1+1后再放一個111,排除掉出現n+1n+1n+1的情況
這樣的構造可以構造出numi∈[1,n]num_i\in[1,n]numi?∈[1,n]?的所有子集
設fi,j:f_{i,j}:fi,j?: 選iii個數和為jjj的方案數
-
前iii個數全+1+1+1
+fi,j?i+f_{i,j-i}+fi,j?i?
-
前i?1i-1i?1個數+1+1+1,新增一個111
+fi?1,j?i+f_{i-1,j-i}+fi?1,j?i?
-
可能出現加111超過nnn的可能,強制前i?1i-1i?1個中有一個超成n+1n+1n+1
?fi?1,j?(n+1)-f_{i-1,j-(n+1)}?fi?1,j?(n+1)?
code
#include <cmath> #include <cstdio> #define int long long #define mod 1000000007 #define maxn 100005 int f[500][maxn]; int fac[maxn << 1], inv[maxn << 1];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }void init( int n ) {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ )fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- )inv[i] = inv[i + 1] * ( i + 1 ) % mod; }int C( int n, int m ) {if( n < 0 || m < 0 || n < m ) return 0;else return fac[n] * inv[m] % mod * inv[n - m] % mod; }signed main() {int n, k;scanf( "%lld %lld", &n, &k );init( n + k );f[0][0] = 1;int lim = sqrt( k << 1 );for( int i = 1;i <= lim;i ++ )for( int j = i;j <= k;j ++ ) {f[i][j] = ( f[i][j - i] + f[i - 1][j - i] ) % mod;if( j <= n ) continue;else f[i][j] = ( f[i][j] - f[i - 1][j - n - 1] + mod ) % mod;}int ans = C( n + k - 1, n - 1 );for( int i = 1;i <= lim && i <= n;i ++ )for( int j = 1;j <= k;j ++ )if( i & 1 ) ans = ( ans - C( n + k - j - 1, n - 1 ) * f[i][j] % mod ) % mod;elseans = ( ans + C( n + k - j - 1, n - 1 ) * f[i][j] % mod ) % mod;printf( "%lld\n", ( ans + mod ) % mod );return 0; }總結
以上是生活随笔為你收集整理的容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十年超越之作 一加12完整搭载新一代超光
- 下一篇: 美国首座小型核反应堆计划已被取消