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 ...
随机推荐
- 全栈数据工程师养成攻略:Python 基本语法
全栈数据工程师养成攻略:Python 基本语法 Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解一些 ...
- Openlayers3 WebGis二次开发包实例
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs& ...
- 多机MySQL一主双从详细安装主从复制
多机MySQL一主双从详细安装 一.复制的工作原理 要想实现AB复制,那么前提是master上必须要开启二进制日志 1.首先master将数据更新记录到二进制日志文件 2.从slave start开始 ...
- jnhs-Myeclipse 10注册教程unable to access jarfile cracker.jar
直接双击jar文件就可以 打开后,随便写一个名字 然后复制LICENSE_KEY的内容,打开myeclipse 在Code那里粘贴你刚才复制的内容,然后点击Save & Active Now ...
- find()和find_all()的具体使用
在我们学会了BeautifulSoup库的用法后,我们就可以使用这个库对HTML进行解析,从网页中提取我们需要的内容. 在BeautifulSoup 文档里,find().find_all()两者的定 ...
- php百度地图计算两地现实距离
请自行到百度地图官网申请您的ak <!--前端获取手机经纬度的代码--> <!--<!DOCTYPE html>--> <!--<html lang=& ...
- day38 03-Spring的IOC和DI的区别
在IOC中有一个DI的概念. IOC是控制反转,DI是依赖注入.现在编写的类里面是没有其他的属性的.如果你学过像UML设计的话, 电视没有遥控器,按按钮也可以,但是紧密的那种,像人和四肢,人如果没有了 ...
- 洛谷P1832 A+B Problem(再升级) [2017年4月计划 动态规划03]
P1832 A+B Problem(再升级) 题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛 ...
- Python3 中 configparser 使用注意事项
在使用configparser时候应注意: ①配置文件(ini文件)的存放位置:配置文件和调用文件放在同一个文件包下面. 使用read()函数读取并解析配置文件时,直接写配置文件(ini文件)的文件名 ...
- golang字符串常用系统函数