HDU 5794 A Simple Chess(多校,dp,容斥)
来源:互联网 发布:股票量化软件 编辑:程序博客网 时间:2024/06/08 00:38
题意:一匹”马”在棋盘上(
解题思路: 存障碍点的时候要进行筛选,从(
AC代码:
#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <complex>#include <cstdio>using namespace std;#define ll long long#define mod 110119ll n,m,r,ca,cnt,a,b,rig,up;ll factorial[110200];ll mod_pow(ll a,ll n,ll p){ ll ret=1,A=a; for(; n ; A=(A*A)%p,n>>=1) if(n & 1)ret=(ret*A)%p; return ret;}void init_factorial(ll p){ factorial[0] = 1; for(ll i = 1;i <= p;i++)factorial[i] = factorial[i-1]*i%p;}ll C(ll a,ll k,ll p) //求C(n,m)%p p最大为10^5。a,b可以很大! a个数中挑k个的组合数{ ll re = 1; for(; a && k ; a /= p , k /= p){ ll aa = a%p;ll bb = k%p; if(aa < bb) return 0; //这个是最后的改动! re = re*factorial[aa]*mod_pow(factorial[bb]*factorial[aa-bb]%p,p-2,p)%p;//这儿的求逆不可先处理 } return re;}ll Lucas(ll a,ll k ,ll p){ if(a<0 || k<0 || a<k)return 0; else return C(a,k,p);}///以上为lucas算法,将输入为if(a<0 || k<0 || a<k)return 0;///时直接输出0,当是就是没加这个判断条件,然后就一直REstruct Point{ ll x,y; bool operator < (const Point & a) const { if(x==a.x) return y<a.y; return x<a.x; }}rock[105];///重载小于号,直接sort预处理减少循环ll dp[105];///dp[]中存的是第i个位,不经过i之前的阻碍点能到达等到达i点的路径个数。int main(){// freopen("1002.in","r",stdin);// freopen("data.out","w",stdout); init_factorial(mod); ca=1; ll x,y; while(~scanf("%I64d%I64d%I64d",&n,&m,&r)) { n--;///题目中坐标从1开始,代码中从0开始,方便取模 m--; cnt=0;///cnt存储符合条件的点,从1开始 for(ll i=0;i<r;i++) { scanf("%I64d%I64d",&x,&y); x--; y--; ll tx=x; ll ty=y; a=2*y-x; b=2*x-y; if(a%3==0&&b%3==0&&a/3>=0&&b/3>=0&&x>=0&&x<=n&&y>=0&&y<=m)///这层的判断,去除不能从(0,0)到达当前点的点 { y=m-y; x=n-x; a=2*y-x; b=2*x-y; if(a%3==0&&b%3==0&&a/3>=0&&b/3>=0&&x>=0&&x<=n&&y>=0&&y<=m)///这层判断去除从当前点不能到达(n,m)的点 { rock[++cnt].x=tx; rock[cnt].y=ty; } } } sort(rock+1,rock+cnt+1);///经过筛选之后,rock中所有的点都能到达,并且到达(n,m)点 if((2*m-n)%3!=0||(2*n-m)%3!=0||(2*m-n)/3<0||(2*n-m)/3<0)///当从(0,0)点不能到达(n,m)点直接输出0 { printf("Case #%I64d: %I64d\n",ca++,(ll)0); continue; } rock[++cnt].x=n;///将(n,m)点存入rock中,这样dp[cnt]直接是答案了 rock[cnt].y=m; for(ll i=1;i<=cnt;i++) { a=(2*rock[i].y-rock[i].x)/3; b=(2*rock[i].x-rock[i].y)/3; dp[i]=Lucas(a+b,a,mod);先将地i个点的路径记录下来, for(ll j=1;j<i;j++) { ll ta=rock[i].x-rock[j].x; ll tb=rock[i].y-rock[j].y; ll taa=(2*ta-tb)/3; ll tbb=(2*tb-ta)/3; if(rock[i].x>=rock[j].x&&rock[i].y>=rock[j].y) dp[i]=((dp[i]-dp[j]*Lucas(taa+tbb,taa,mod))%mod+mod)%mod;///减去经过之前的点的路径个数 } } printf("Case #%I64d: %I64d\n",ca++,dp[cnt]); } return 0;}
0 0
- HDU 5794 A Simple Chess(多校,dp,容斥)
- HDU 5794 A Simple Chess 16多校6 dp 容斥 lucas
- HDU 5794 A Simple Chess (容斥+Lucas定理)
- hdu 5794 A Simple Chess 【lucas+容斥】
- HDU 5794 A Simple Chess (容斥+lucas定理)
- HDU 5794-B - A Simple Chess - DP
- HDU 5794 A Simple Chess(卢卡斯定理 + 容斥原理)
- HDU-5794-A Simple Chess-容斥加数学推导加大组合数
- (HDU 5794)2016 Multi-University Training Contest 6 A Simple Chess (Lucas、容斥)
- HDU5794 A Simple Chess (容斥+卢卡斯)
- 【HDU5794】 A Simple Chess(Lucas+容斥)
- HDU 5794 A Simple Chess (dp+Lucas组合数取模)
- hdu 5794 A Simple Chess (dp+lucas定理)
- HDU 5794 A Simple Chess(组合数学+dp)
- HDU 5794 A Simple Chess
- 【HDU】 5794 A Simple Chess
- HDU 5794 A Simple Chess
- 【HDOJ 5794】A Simple Chess(大组合数Lucas定理+容斥)
- 接口数据的缓存及Linux定时缓存数据
- 【一天一道Leetcode】#203.Remove Linked List Elements
- 【算法】(扩展)KMP+manacher
- Spring整理系列(03)——spring容器ApplicationContext初始化(spring应用上下文初始化)
- HDU 1171 Big Event in HDU(DP)
- HDU 5794 A Simple Chess(多校,dp,容斥)
- 不同系统如何安装 Git
- 2016-8-6夏令营总结(kmp,回文串,扩展kmp)
- iOS块动画使用
- characters
- okhttp3使用
- “除非Microsoft FTP 服务(FTPSVC)正在运行,否则无法启动FTP站点。服务目前已停止”问题解决
- iOS头尾式动画使用
- nrf24l01+