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 ...
随机推荐
- id生成器
- Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器
MTV与MVC(了解): MTV模型(Django用的就是MTV): M:模型层(models.py) T:templates C:views MVC模型: M:模型层(models.py) V:视图 ...
- JAVA邀请码生成器
code import java.util.Random; /** * 邀请码生成器,算法原理:<br/> * 1) 获取id: 1127738 <br/> * 2) 使用自定 ...
- linux-jdk-mysql-tomcat安装
1.JDK安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | grep java 1)卸载两个 ...
- css不定高图文垂直居中的三种方法
html部分 <div class="box"> <img class="img" src="http://p2.so.qhmsg. ...
- Hibernate_添加联系人练习
分析: 联系人与客户是多对一,一个客户(公司)有多个联系人,在多的这一方,即LinkMan, 1.LinkMan.java中除自身属性外,还需要 2.在hbm.xml文件中,加上 意思是建立一个外键用 ...
- 【洛谷P2722 USACO】 总分 01背包模板
P2722 总分 Score Inflation 题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个 ...
- 理解async和await
async 是“异步”的简写,而 await 可以认为是 async wait 的简写. 所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执 ...
- 【心有猛虎】react-lesson
这个项目标识:构建一套适合 React.ES6 开发的脚手架 项目地址为:https://github.com/ZengTianShengZ/react-lesson 运行的是第一课,基本上可以当作是 ...
- 基于jQuery,bootstrap的bootstrapValidator的学习(一)
bootstrap:能够增加兼容性的强大框架. 因为移动端项目需要数据验证,就开始学习了bootstrapValidator . 1.需要引用的文件: css: bootstrap.min.css b ...