对于前30%的数据,可以考虑dp,f[i][j][k]表示时间为i,在i,j位置的方案数,枚举转移即可。要注意的是可以走到矩阵外。

对于另外30%数据,考虑推一下式子,设向右走y步,左z,上s,下x。那么y-z=n,s-x=m。所以我们枚举s就可以求得sxzy,步数确定之后就比较简单了,显然答案为

$∑C_T^s*C_{T-s}^x*C_{T-s-x}^z*C_{T-s-x-z}^y$,化减得ans=∑$\frac{T!}{s!x!z!y!}$,由于mod是质数,直接逆元干就行了。

对于100%数据,难点就在于p不是质数,开始我想着分解质因数,然后T了。

考虑一下如何求组合数%合数?(合数为若干质数乘积)

将合数质因数分解,用卢卡斯求出组合数mod每个质数,然后发现其实就是线性同余方程组,CRT解即可。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define int LL
#define ma(x) memset(x,0,sizeof(x))
#define LL long long
using namespace std;
int T,mod,n,m;
int s,x,z,y;
LL f[][][];
LL jc[];
int cnt[];
int prime[],num;
bool isprime[];
LL exgcd(int a,int b,int &x,int &y)
{
if(!b){x=,y=;return a;}
int gcd=exgcd(b,a%b,x,y),t=x;
x=y,y=t-a/b*y;
return gcd;
}
void ss()
{
const int N=;
for(int i=;i<=N;i++)isprime[i]=;
for(int i=;i<=N;i++)
{
if(isprime[i])prime[++num]=i;
for(int j=;j<=num&&i*prime[j]<=N;j++)
{
isprime[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
void add(int x,int nu)
{
for(int i=;prime[i]*prime[i]<=x;i++)
while(x%prime[i]==){cnt[prime[i]]+=nu;x/=prime[i];}
cnt[x]+=nu;
}
bool pdprime(int x)
{
for(int i=;i*i<=x;i++)
if(x%i==)return ;
return ;
}
int fj[],cntt;
LL poww(LL a,int b,int mod)
{
LL ans=;
while(b)
{
if(b&)ans=ans*a%mod;
a=a*a%mod;
b=b>>;
}
return ans;
}
LL C(int n,int m,int mod)
{
if(m>n)return ;
return jc[n]*poww(jc[m],mod-,mod)%mod*poww(jc[n-m],mod-,mod)%mod;
}
LL Lucas(int n,int m,int mod)
{
if(m>n)return ;
if(!m)return ;
return Lucas(n/mod,m/mod,mod)*C(n%mod,m%mod,mod)%mod;
}
int CRT(int W[],int B[],int k)
{
int x,y,a=,m,n=;
for(int i=;i<=k;i++)
n*=W[i];
for(int i=;i<=k;i++)
{
m=n/W[i];
exgcd(W[i],m,x,y);
a=(a+y*m*B[i])%n;
}
return a>?a:(a+n);
}
int w[],b[];
signed main()
{
// freopen("out.doc","w",stdout); ss();
cin>>T>>mod>>n>>m;int tem=mod;
for(int i=;prime[i]*prime[i]<=tem;i++)
while(tem%prime[i]==)
{
fj[++cntt]=prime[i];
tem/=prime[i];
}
if(tem>)fj[++cntt]=tem;
// for(int i=1;i<=cntt;i++)cout<<fj[i]<<" ";puts("");
if(T<=)
{
f[][][]=;
for(int i=;i<=T;i++)
for(int j=;j<=n+;j++)
for(int k=;k<=m+;k++)
f[i][j][k]=((f[i-][j][k-]+f[i-][j][k+])%mod+(f[i-][j-][k]+f[i-][j+][k])%mod)%mod;
cout<<f[T][n+][m+]%mod<<endl;
return ;
}
if(pdprime(mod))
{
if(n<)n=-n;
if(m<)m=-m;
jc[]=;for(int i=;i<=;i++)jc[i]=jc[i-]*i%mod;
LL ans=;
for(int s=m;s<=T;s++)
{
x=s-m;
if((T-s-x+n)%!=)continue;
y=(T-s-x+n)/;
z=y-n;
if(y<||z<)break;
ans=(ans+jc[T]*poww(jc[s],mod-,mod)%mod*poww(jc[x],mod-,mod)%mod*poww(jc[z],mod-,mod)%mod*poww(jc[y],mod-,mod)%mod)%mod;
}
cout<<ans<<endl;
}
else
{
if(n<)n=-n;
if(m<)m=-m;
jc[]=;for(int i=;i<=;i++)jc[i]=jc[i-]*i%mod;
LL ans=;
for(int s=m;s<=T;s++)
{
x=s-m;
if((T-s-x+n)%!=)continue;
y=(T-s-x+n)/;
z=y-n;
if(y<||z<)break;
LL tem=;
ma(w),ma(b);
for(int i=;i<=cntt;i++)
w[i]=fj[i],b[i]=Lucas(T,s,fj[i]);
tem=tem*CRT(w,b,cntt)%mod;
ma(w),ma(b);
for(int i=;i<=cntt;i++)
w[i]=fj[i],b[i]=Lucas(T-s,x,fj[i]);
tem=tem*CRT(w,b,cntt)%mod;
ma(w),ma(b);
for(int i=;i<=cntt;i++)
w[i]=fj[i],b[i]=Lucas(T-s-x,z,fj[i]);
tem=tem*CRT(w,b,cntt)%mod;
ans=(ans+tem)%mod;
}
cout<<ans%mod<<endl;
}
}

HZOJ visit的更多相关文章

  1. HZOJ 20190722 visit (组合数学+数论)

    考试T2,考试时打了个$O(n^3)$dp暴力,思路还是很好想的,但细节也不少,然后滚动数组没清空,而且题又看错了,只得了10pts,真是血的教训. 题解: 其实看数据范围,给出了模数是否为质数,其实 ...

  2. hdu4607 Park Visit(树的直径)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

  4. [Swift]LeetCode811. 子域名访问计数 | Subdomain Visit Count

    A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...

  5. [LeetCode] Subdomain Visit Count 子域名访问量统计

    A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...

  6. LeetCode 811 Subdomain Visit Count 解题报告

    题目要求 A website domain like "discuss.leetcode.com" consists of various subdomains. At the t ...

  7. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem A. Alien Visit 计算几何

    Problem A. Alien Visit 题目连接: http://codeforces.com/gym/100714 Description Witness: "First, I sa ...

  8. HDU 4607 Park Visit (树的最长链)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. [LeetCode&Python] Problem 811. Subdomain Visit Count

    A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...

随机推荐

  1. id生成器

  2. Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器

    MTV与MVC(了解): MTV模型(Django用的就是MTV): M:模型层(models.py) T:templates C:views MVC模型: M:模型层(models.py) V:视图 ...

  3. JAVA邀请码生成器

    code import java.util.Random; /** * 邀请码生成器,算法原理:<br/> * 1) 获取id: 1127738 <br/> * 2) 使用自定 ...

  4. linux-jdk-mysql-tomcat安装

    1.JDK安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | grep java 1)卸载两个 ...

  5. css不定高图文垂直居中的三种方法

    html部分 <div class="box"> <img class="img" src="http://p2.so.qhmsg. ...

  6. Hibernate_添加联系人练习

    分析: 联系人与客户是多对一,一个客户(公司)有多个联系人,在多的这一方,即LinkMan, 1.LinkMan.java中除自身属性外,还需要 2.在hbm.xml文件中,加上 意思是建立一个外键用 ...

  7. 【洛谷P2722 USACO】 总分 01背包模板

    P2722 总分 Score Inflation 题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个 ...

  8. 理解async和await

    async 是“异步”的简写,而 await 可以认为是 async wait 的简写. 所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执 ...

  9. 【心有猛虎】react-lesson

    这个项目标识:构建一套适合 React.ES6 开发的脚手架 项目地址为:https://github.com/ZengTianShengZ/react-lesson 运行的是第一课,基本上可以当作是 ...

  10. 基于jQuery,bootstrap的bootstrapValidator的学习(一)

    bootstrap:能够增加兼容性的强大框架. 因为移动端项目需要数据验证,就开始学习了bootstrapValidator . 1.需要引用的文件: css: bootstrap.min.css b ...