4767: 兩雙手time limit: 10 sec memory limit: 256 mb
submit: 684 solved: 208
[submit][status][discuss] description
老w是個棋藝高超的棋手,他最喜歡的棋子是馬,更具體地,他更加喜歡馬所行走的方式。老w下棋時覺得無聊,便
決定加強馬所行走的方式,更具體地,他有兩雙手,其中一雙手能讓馬從(u,v)移動到(u+ax,v+ay)而另一雙手能讓
馬從(u,v)移動到(u+bx,v+by)。小w看見老w的下棋方式,覺得非常有趣,他開始思考乙個問題:假設棋盤是個無限
大的二維平面,一開始馬在原點(0,0)上,若用老w的兩種方式進行移動,他有多少種不同的移動方法到達點(ex,ey
)呢?兩種移動方法不同當且僅當移動步數不同或某一步所到達的點不同。老w聽了這個問題,覺得還不夠有趣,他
在平面上又設立了n個禁止點,表示馬不能走到這些點上,現在他們想知道,這種情況下馬有多少種不同的移動方
法呢?答案數可能很大,你只要告訴他們答案模(10^9+7)的值就行。
input
第一行三個整數ex,ey,n分別表示馬的目標點座標與禁止點數目。
第二行四個整數ax,ay,bx,by分別表示兩種單步移動的方法,保證ax*by-ay*bx≠0
接下來n行每行兩個整數sxi,syi,表示乙個禁止點。
|ax|,|ay|,|bx|,|by| <= 500, 0 <= n,ex,ey <= 500
output
僅一行乙個整數,表示所求的答案。
sample input
4 4 1
0 1 1 0
2 3
sample output
40 組合+容斥
可以發現兩種方法走的步數是一定的
因為 ax*x+bx*y=ex ay*x+by*y=ey唯一解
特判能不能走到此點,並且把座標化成二元一次方程組的解(x,y)
那麼ans=總方案-路上經過禁止點的方案
算路徑方案用組合數
(0,0)一次向上或右走一單位,走到(n,m)的方案為c(n+m,m)
再考慮路上經過禁止點的方案
對於每個禁止點,可以算出到達它的方案,再用容斥減去之前已經經過禁止點的方案
對於禁止點i,如果禁止點j可以到達i,那麼到達i的方案要減去到達j再到i的方案
由於座標化簡後相當於只向右上走,所以按座標排序,只有排在它之前的點可能到達它
/***wa了沒調出來。
*/#include
#include
#include
#include
#define ll long long
#define n 505
#define mod 1000000007
using
namespace
std;
int ex,ey,ax,ay,bx,by,cnt,n,m,num,fac[1005*1005
],f[n];
struct nodep[n];
bool check(int x,int y,int &a,int &b)
void
pre()
int quick(int a,int
b)
returnc;}
int c(int x,int
y)int calc(int x,int
y)bool cmp(node a,node b)
intmain()
for(int i=1;i<=num;i++)
pre();
p[++cnt].x=n;p[cnt].y=m;
sort(p+1,p+1+cnt,cmp);
for(int i=1;i<=cnt;i++)
f[cnt]
<0?f[cnt]+=mod:1
; cout
}
BZOJ 4767 兩雙手(容斥 DP)
4767.兩雙手 題目位址 3782.上學路線 題目位址 一道很像的題。將兩個行走方式看做兩個二維向量 vec,vec 令其為該向量空間的基,對該空間變換後,得到每個禁止點的新座標和終點的新座標。可以發現從乙個點 u u 1,u 2 走到另外乙個點 v v 1,v 2 的行走步數是唯一的 由於基向量...
省選專練之容斥 BZOJ4767 兩雙手
老w是個棋藝高超的棋手,他最喜歡的棋子是馬,更具體地,他更加喜歡馬所行走的方式。老w下棋時覺得無聊,便決定加強馬所行走的方式,更具體地,他有兩雙手,其中一雙手能讓馬從 u,v 移動到 u ax,v ay 而另一雙手能讓馬從 u,v 移動到 u bx,v by 小w看見老w的下棋方式,覺得非常有趣,他...
BZOJ 4767 兩雙手(組合數學 Dp)
description 老w是個棋藝高超的棋手,他最喜歡的棋子是馬,更具體地,他更加喜歡馬所行走的方式。老w下棋時覺得無聊,便 決定加強馬所行走的方式,更具體地,他有兩雙手,其中一雙手能讓馬從 u,v 移動到 u ax,v ay 而另一雙手能讓 馬從 u,v 移動到 u bx,v by 小w看見老w...