HZOJ visit
对于前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的更多相关文章
- HZOJ 20190722 visit (组合数学+数论)
考试T2,考试时打了个$O(n^3)$dp暴力,思路还是很好想的,但细节也不少,然后滚动数组没清空,而且题又看错了,只得了10pts,真是血的教训. 题解: 其实看数据范围,给出了模数是否为质数,其实 ...
- hdu4607 Park Visit(树的直径)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
- [Swift]LeetCode811. 子域名访问计数 | Subdomain Visit Count
A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...
- [LeetCode] Subdomain Visit Count 子域名访问量统计
A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...
- LeetCode 811 Subdomain Visit Count 解题报告
题目要求 A website domain like "discuss.leetcode.com" consists of various subdomains. At the t ...
- 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 ...
- HDU 4607 Park Visit (树的最长链)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [LeetCode&Python] Problem 811. Subdomain Visit Count
A website domain like "discuss.leetcode.com" consists of various subdomains. At the top le ...
随机推荐
- 前端js框架引入管理bundle.js
最先在ionic中看到bundle.js,,,然而它不是一个框架
- hbase phoenix char may not be null
在使用phoenix做hbase的相关測试的时候.会出现 char may not be null 的错误. 这是因为建表和导入的数据不匹配导致的.主要是char的定义,假如一个字段定义为char类型 ...
- php数字转人民币金额大写
numToRmb.php <?php header("content-type:text/html;charset=utf-8"); function numToRmb($n ...
- Spring 的初次见面
简介: Spring Framework 是一个开源的企业级应用程序框架,为构建满足企业级需求的应用程序提供了大量的工具集.推出该框架的原因是在时候用J2EE进行开发是会提高复杂性. Spring三大 ...
- Leetcode79. Word Search单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...
- CSS基础强化
1. 浮动引起元素变成行内块元素-display:inline-block <div style="width: 400px;height: 200px;"> < ...
- 洛谷1081 (NOIp2012) 开车旅行——倍增预处理
题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...
- web前端学习(三)css学习笔记部分(5)-- CSS动画--页面特效、HTML与CSS3简单页面效果实例
CSS动画--页面特效部分内容目前仅仅观看了解内容,记录简单笔记,之后工作了进行内容的补充 7. CSS动画--页面特效 7.1 2D.3D转换 7.1.1 通过CSS3转换,我们能够对元素进行 ...
- webserver的性能问题,一语道破真谛
一直纠结我们要大减的paas平台需要支持多大的并发数. 看到一个网友所说的,恍然大悟,按原有我的理解和要求,并发达到w级 req/s,已经是非常高的要求了,单纯从软件上是很难实现的,一定要以来硬件上的 ...
- spring拦截器Interceptor
在Spring Boot中,拦截器可以分为两种类型: 一是WebMVC,负责拦截请求,类似于过滤器,对用户的请求在Controller接收前进行处理,在Controller处理完成后加工结果等.使用时 ...