UVALive 6916---Punching Robot(卢卡斯+容斥)
2018-06-17 23:39:44来源:未知 阅读 ()
题目链接
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4928
与HDU 5794相似 博客链接
题意:在一个棋盘状的网格中,有很多障碍点,求从(1,1)走到(n,m)的方法数?
思路:对障碍点进行排序,两重循环去重,加上卢卡斯定理快速求组合数;
代码如下:
#include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <cmath> using namespace std; const long long mod=997; typedef long long LL; struct Node { long long x; long long y; long long s; }node[105]; int cmp(const Node s1,const Node s2) { if(s1.x==s2.x) return s1.y<s2.y; return s1.x<s2.x; } LL PowMod(LL a,LL b,LL MOD) { LL ret=1; while(b) { if(b&1) ret=(ret*a)%MOD; a=(a*a)%MOD; b>>=1; } return ret; } LL fac[1000005]; LL Get_Fact(LL p) { fac[0]=1; for(int i=1; i<=p; i++) fac[i]=(fac[i-1]*i)%p; } LL calc(LL n,LL m,LL p) { LL ret=1; while(n&&m) { LL a=n%p,b=m%p; if(a<b) return 0; ret=(ret*fac[a]*PowMod(fac[b]*fac[a-b]%p,p-2,p))%p; n/=p; m/=p; } return ret; } int main() { long long n,m; int Case=1,k,T; Get_Fact(mod); //cout<<calc(2,0,mod); cin>>T; while(T--) { scanf("%lld%lld%d",&n,&m,&k); int tot=0; long long sum=0; long long x,y; for(int i=0;i<k;i++) { scanf("%lld%lld",&x,&y); if(x-1>=1&&y-1>=1) { node[tot].x=x-1; node[tot].y=y-1; tot++; } if(x-1>=1&&y>=1) { node[tot].x=x-1; node[tot].y=y; tot++; } if(x-1>=1&&y+1>=1) { node[tot].x=x-1; node[tot].y=y+1; tot++; } if(x>=1&&y-1>=1) { node[tot].x=x; node[tot].y=y-1; tot++; } if(x>=1&&y+1>=1) { node[tot].x=x; node[tot].y=y+1; tot++; } if(x+1>=1&&y-1>=1) { node[tot].x=x+1; node[tot].y=y-1; tot++; } if(x+1>=1&&y>=1) { node[tot].x=x+1; node[tot].y=y; tot++; } if(x+1>=1&&y+1>=1) { node[tot].x=x+1; node[tot].y=y+1; tot++; } node[tot].x=x; node[tot].y=y; tot++; } if(tot>0) sort(node,node+tot,cmp); //cout<<x<<y<<endl; //for(int i=0;i<tot;i++) //cout<<"tot: "<<node[i].x<<" "<<node[i].y<<endl; sum=calc(n+m-2,n-1,mod)%mod; // cout<<"n: "<<n<<" m: "<<m<<endl; //cout<<tot<<endl; //cout<<sum<<endl; for(int i=0;i<tot;i++) { node[i].s=calc(node[i].x+node[i].y-2,node[i].x-1,mod)%mod; } for(int i=0;i<tot;i++) { long long tt=calc(n-node[i].x+m-node[i].y,m-node[i].y,mod); for(int j=i+1;j<tot;j++) { if(node[j].y>=node[i].y) { long long d1=node[j].y-node[i].y; long long d2=node[j].x-node[i].x; node[j].s=(node[j].s-(node[i].s*calc(d1+d2,d1,mod))%mod)%mod; } } sum=(sum-(node[i].s*tt)%mod)%mod; sum = (sum%mod+mod)%mod; } printf("Case #%d: %lld\n",Case++,sum); } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Qt 之 入门例程
- HDU4576 Robot(概率) 2018-08-26
- UVALive - 6434 (贪心) 2018-07-28
- UVALive 6908---Electric Bike(DP或记录型深搜) 2018-06-27
- UVALive 4987---Evacuation Plan(区间DP) 2018-06-17
- UVALive 6853(dp) 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash