1. 程式人生 > >[NOIP模擬10.24][容斥原理]Silhouette

[NOIP模擬10.24][容斥原理]Silhouette

Description

有一個n  n的網格,在每個格子上堆疊了一些邊長為1的立方體。 現在給出這個三維幾何體的正檢視和左檢視,求有多少種與之符合的堆疊立方體的方
案。兩種方案被認為是不同的,當且僅當某個格子上立方體的數量不同。 輸出答案對109 + 7取模的結果。

Sample Input

2
1 2
2 1

Sample Output

5

題解

容易發現,其實就是要求這樣一個方程的整數解數量

i [ 1 , n ] , m
a x ( x j , i
) = A j , m a x ( x j , i ) = B i \forall i\in[1,n] ,max(x_{j,i})=A_j,max(x_{j,i})=B_i
A , B A,B 排序,顯然這樣對答案沒有影響。判斷最大值是否相等即可判斷無解
我們考慮列舉 A , B A,B 中所有數 S S ,每次確定最大值是 S S 的這片區域的方案數
先考慮總最大值為 S S 的情況,顯然這樣的區域是一個 a b a*b 的矩形
f [ i ] f[i] 表示至少有 i i 行不合法的方案數(保證列全部合法)
有轉移
f [ i ] = C a i ( S i ( ( S + 1 ) a i S a i ) ) b f[i]=\sum C_{a}^{i}*(S^i*((S+1)^{a-i}-S^{a-i}))^b
.簡單容斥可知答案
f [ 0 ] = 1 k f [ k ] f[0]=\sum-1^kf[k]
再考慮 S S 不是最大值的情況
畫圖可知這樣的區域可能是 L L 形或者矩形
我們發現, L L 形可能產生非法情況的只有在中間交界處的那個矩形
因為上面的行更大,不可能非法。右邊的列更大,也不可能非法
設這個矩形是 a b a*b 的,上面還有 c c 行,右邊還有 d d
有轉移
f [ i ] = C a i ( S i ( ( S + 1 ) a + c i S a + c i ) ) b ( S i ( ( S + 1 ) a i S a i ) ) d f[i]=\sum C_{a}^i*(S^i*((S+1)^{a+c-i}-S^{a+c-i}))^b*(S^i*((S+1)^{a-i}-S^{a-i}))^d
左邊處理的是一個 ( a + c ) b (a+c)*b 的矩陣,右邊處理的是一個 a d a*d 的矩陣
同樣容斥 f [ 0 ] = 1 k f [ k ] f[0]=\sum-1^kf[k] 可以知道答案
複雜度 n l o g n nlogn

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define mod 1000000007
using namespace std;
inline int read()
{
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void write(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
inline void pr1(int x){write(x);printf(" ");}
inline void pr2(int x){write(x);puts("");}
LL pow_mod(LL a,LL b)
{
	LL ret=1;
	while(b)
	{
		if(b&1)ret=ret*a%mod;
		a=a*a%mod;b>>=1;
	}
	return ret;
}
LL inv[110000],pre[110000];
LL C(int n,int m){return pre[n]*inv[m]%mod*inv[n-m]%mod;}
LL solve(LL a,LL b,LL c,LL d,LL s)
{
	LL ret=0;
	for(int i=0;i<=a;i++)
	{
		LL sum=C(a,i)*pow_mod(pow_mod(s,i)*((pow_mod(s+1,a+c-i)-pow_mod(s,a+c-i)+mod)%mod)%mod,b)%mod;
		sum=sum*pow_mod(pow_mod(s,i)*pow_mod(s+1,a-i)%mod,d)%mod;
		if(i&1)ret=(ret-sum+mod)%mod;
		else ret=(ret+sum)%mod;
	}
	return ret;
}
int s1[110000],s2[110000],tt[210000],ln;
int n;
int main()
{
	pre[0]=1;for(int i=1;i<=100000;i++)pre[i]=pre[i-1]*i%mod;
	inv[100000]=pow_mod(pre[100000],mod-2);
	for(int i=99999;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
	n=read();
	for(int i=1;i<=n;i++)s1[i]=read(),tt[++ln]=s1[i];
	for(int i=1;i<=n;i++)s2[i]=read(),tt[++ln]=s2[i];
	sort(s1+1,s1+1+n);sort(s2+1,s2+1+n);
	sort(tt+1,tt+1+ln);ln=unique(tt+1,tt+1+ln)-(tt+1);
	if(s1[n]!=s2[n])return puts("0"),0;
	int lst1
            
           

相關推薦

[NOIP模擬10.24][原理]Silhouette

Description 有一個n  n的網格,在每個格子上堆疊了一些邊長為1的立方體。 現在給出這個三維幾何體的正檢視和左檢視,求有多少種與之符合的堆疊立方體的方 案。兩種方案被認為是不同的,當且僅當某個格子上立方體的數量不同。 輸出答案對109 + 7取模的結果。

【浮*光】 #noip模擬10.24#

我真的.真的..真的...炒雞炒雞高興的說! 因為,在noip前16天,我快要退役的時候,居然 ... AK辣 ~\(≧▽≦)/~ 啦啦啦 好吧我承認我是 295分 ...... 而且這麼高是因為第二題抄了 斜率優化 的模板, 第三題和 LRZ大神 討論了並且抄了他

【題解】[牛客網NOIP賽前集訓營-提高組(第二場)]B.分糖果 單調棧優化線性DP+原理

題目連結 #include<cstdio> #define re register typedef long long ll; const int N=1e6+10; const int INF=0x3f3f3f3f; const int mod=1e9

2018.10.18每天認真做一道數學(數論)題之BZOJ 1042 [HAOI2008] 硬幣購物【揹包DP】【原理

對於每個詢問,答案顯然為:S所有超過數量限制的方案數- c [ 1

2018.10.05 bzoj2393: Cirno的完美算數教室(原理+搜尋)

傳送門 經典題目。 顯然滿足題意的數最多不超過1024個。 然後對於兩個數a,ba,ba,b,如果aaa是bbb的倍數,那麼就不必計算aaa的貢獻。 處理出來之後容斥原理+爆搜剪枝就能過了。 程式碼:

求N(10^14)以內與N互質的數的和(原理,或者尤拉函式)

#include <iostream> #include <cstring> #include <algorithm> #include <cmath>

POJ 1091 原理

.org 質因子 blank dfs tar cin href strong 元組 鏈接: http://poj.org/problem?id=1091 題意: 給你兩個正整數n,m,讓你求長度為n+1的滿足條件的一個等式:a[1]*x1+a[2]*x2+a[3]*x

原理

clu images class 又是 對象 title href 推理 計算 容斥原理(Inclusion–exclusion principle),是指在計數時,必須註意無一重復,無一遺漏,為了使重疊部分不被重復計算,人們研究出一種新的計數方法。這種方法的基

POJ 2773 原理

for log cto tor ans 個數 ret num void 鏈接: http://www.cnblogs.com/MashiroSky/p/5913989.html 題意: 給出兩個數m,k,要求求出從1開始與m互質的第k個數。 題解: 二分一個答案m

{原理}

.com lld hide mes problem fine efi lose -a 題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1284 比較基礎練一下。 1 #include

POJ3904 Sky Code【原理

define 原理 tail n-1 pop blog soft ace tdi 題目鏈接: http://poj.org/problem?id=3904 題目大意: 給你N個整數。從這N個數中選擇4個數,使得這四個數的公約數為1。求滿足條件的 四元組個數。

洛谷P1450 [HAOI2008]硬幣購物 動態規劃 + 原理

string -1 line sum mes 開始 clas 完全背包 預處理 洛谷P1450 [HAOI2008]硬幣購物 動態規劃 + 容斥原理 1、首先我們去掉限制 假設 能夠取 無數次 也就是說一開始把他當做完全背包來考慮 離線DP 預處理 復雜度 4*v

hdu 1695 GCD(歐拉函數+原理)

spi fin clu init mod long long tac push_back gcd http://acm.hdu.edu.cn/showproblem.php?pid=1695 非常經典的題。同一時候感覺也非常難。 在區間[a,b]和[c,d]內分

洛谷1002 原理+dfs OR DP

amp define its name sign pri last += include //By SiriusRen #include <bits/stdc++.h> using namespace std; #define int long lon

TopCoder SRM 717 Div2 C.DerangementsDiv2[數論][原理][錯排]

long max math 需要 linker nal tex 排列 lin 題意:從1到n+m的數組中選m個數字且每個數字和在原數組中下標不同,求方案數。例如 n=1 m = 2 則存在{2,1},{2,3},{3,1} 題解:錯排問題模板 下面是使用容斥原理推導的過程

[原理] hdu 1796 How many integers can you find

pos lcm 一個 每一個 fin memset 而不是 std != 題意: 給一個N。然後給M個數,問1~N-1裏面有多少個數能被這M個數中一個或多個數整除。 思路: 首先要N-- 然後對於每一個數M 事實上1~N-1內能被其整除的 就是有(N-1)/

POJ2773 Happy 2006【原理

sca problem article 容斥原理 lan /tmp .org family pop 題目鏈接: http://poj.org/problem?id=2773 題目大意: 給你兩個整數N和K。找到第k個與N互素的數(互素的數從小到大排

洛谷 P2986 [USACO10MAR]Great Cow Gat…(樹形dp+原理)

nco more printf ide eva gre ans names get P2986 [USACO10MAR]偉大的奶牛聚集Great Cow Gat… 題目描述 Bessie is planning the annual Great Cow G

HDU 5794 A Simple Chess(楊輝三角+原理+Lucas)

exgcd -i -- || 兩種方法 sizeof put amp mem 題目鏈接 A Simple Chess 打表發現這其實是一個楊輝三角…… 然後發現很多格子上方案數都是0 對於那寫可能可以到達的點(先不考慮障礙點),我們先叫做有

bzoj 2005 能量采集 - 原理

100% itl memset blog read 線段 太陽 break als 棟棟有一塊長方形的地,他在地上種了一種能量植物,這種植物可以采集太陽光的能量。在這些植物采集能量後, 棟棟再使用一個能量匯集機器把這些植物采集到的能量匯集到一起。 棟棟的植物種得非常整