对于前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. url映射 ccf (Java正则表达式80分解法)

    问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...

  2. js控制“鼠标点击按钮后,按钮消失“(可以自己添加video标签控制播放)

  3. maven编译报错 错误: -source 1.5 中不支持 lambda 表达式

    ji与基于maven的工程java应用程序非web应用的 参考这个https://www.cnblogs.com/softidea/p/6256543.html 但是java应用里边是没有这个配置的, ...

  4. 洛谷 P3742 umi的函数【构造】

    题目背景(https://www.luogu.org/problemnew/show/P3742) umi 找到了一个神秘的函数 f. 题目描述 这个函数接受两个字符串 s1,s2.这些字符串只能由小 ...

  5. 2019-8-31-dotnet-Framework-源代码-类库的意思

    title author date CreateTime categories dotnet Framework 源代码 类库的意思 lindexi 2019-08-31 16:55:58 +0800 ...

  6. ADSL pppoe 拔号工具rp-pppoe

    rp-pppoe 目前在各大发行版本都是存在的,比如Redhat/Fedora.红旗.Slackware.Debian.SuSE等系统,都是采用这个拔号软件,所以您大可不必为下载源码编译安装.只需要在 ...

  7. Djngo 请求的生命周期

    1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_view() / ...

  8. scala的插值器

    Scala 为我们提供了三种字符串插值的方式,分别是 s, f 和 raw.它们都是定义在 StringContext 中的方法. s 字符串插值器 val a = 2println(s"小 ...

  9. OpenLayers使用点要素作为标记

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  10. 去掉CSS赘余代码,CSS可以更简洁

    本篇文章适合css新手学习,对于已经掌握了css的朋友们也可以通过本片文章来复习知识. 作者通过实践,认为在有些情况下css的代码是可以更加简洁的,多数情况下是因为新手对于一些具有多属性的元素代码不能 ...