[NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)
因为有T的限制,所以不难搞出来一个$O(T^3)$的暴力dp
但我没试 据说有30分?
正解的话显然是组合数学啦
首先$n,m$可能为负,但这并没有影响,
我们可以都把它搞成正的 即都看作向右上方走
那么可以想到真正有效的步都是向右或者向上走的 其它两个方向都是在起反作用
设u为向上走步数,d下,l左,r右
它们满足关系:
$r-l=m,u-d=n,T=u+d+l+r$
因为有效步数为$m+n$,所以$T-m-n$必为偶数
因为要保证剩下的步上下均分,左右均分
枚举$udlr$其中一个可得最终答案:
$ans=\sum \limits_{i=n,2|(i-n)}^{t-m} \binom{t}{i} \binom{i}{\frac{i-n}{2}} \binom{t-i}{\frac{t-i-m}{2}}$
(从天皇那里copy过来的)
按道理讲本题应该结束了
但丧心病狂的出题人还要恶心你一下:模数可能不为质数
但也给出一定是几个互不相同的质数之积,从exLucas的魔爪中拯救了我们
之后就中国剩余定理就行了
把模数分解出质因子$p[i]$,对于每个因子都算一边答案,记为$ans[i]$
那么得到最后答案的过程,就相当于求解
$\begin{cases} x\equiv ans_1(mod\ p_1)\\ x\equiv ans_2(mod\ p_2)\\ x\equiv ans_3(mod\ p_3)\\ ...\\ x\equiv ans_n(mod\ p_n)\\ \end{cases}$
这不裸的CRT么?板子打一遍就完事了。
扩欧都不用打,可以用前边的快速幂 结合费马小定理 解CRT里的同余方程。
//#define R
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#define re register
using namespace std;
const int N=;
typedef long long ll;
int T,mod,n,m;
ll fac[N],ans[];
vector<int> fact;
int abss(int x)
{
return x<?-x:x;
}
void divi(int x)
{
int sq=sqrt(x)+;
for(int i=;i<=sq;i++)
{
if(x%i==)
{
fact.push_back(i);
while(x%i==)x/=i;
}
if(x==)break;
}
if(x!=)fact.push_back(x);
}
ll qpow(ll a,ll b,ll p)
{
ll res=;a=a%p;
while(b)
{
if(b&)res=res*a%p;
a=a*a%p;
b>>=;
}
return res;
}
ll C(ll x,ll y,ll p)
{
if(x<y)return ;
return fac[x]*qpow(fac[y],p-,p)%p*qpow(fac[x-y],p-,p)%p;
}
ll lucas(ll x,ll y,ll p)
{
if(!y)return ;
return C(x%p,y%p,p)*lucas(x/p,y/p,p)%p;
}
void getfac(ll p)
{
fac[]=;
for(int i=;i<=T;i++)
fac[i]=1LL*i*fac[i-]%p;
}
int main()
{
scanf("%d%d%d%d",&T,&mod,&n,&m);
n=abss(n),m=abss(m);
divi(mod);
int sz=fact.size();
for(re int now=;now<sz;now++)
{
int p=fact[now];getfac(p);
for(re int i=n;i<=T-m;i++)
{
if((i-n)&||(T-i-m)&)continue;
ll res=;
res=res*lucas(T,i,p)%p*lucas(i,(i-n)/,p)%p*lucas(T-i,(T-i-m)/,p)%p;
ans[now]=(ans[now]+res)%p;
}
}
ll anss=;
for(re int i=;i<sz;i++)
{
ll times=mod/fact[i];
ll ress=qpow(times,fact[i]-,fact[i]);
ress=(ress%fact[i]+fact[i])%fact[i];
anss=(anss+times*ress*ans[i])%mod;
}
cout<<(anss+mod)%mod<<endl;
return ;
}
[NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)的更多相关文章
- [NOIP模拟测试37]反思+题解
一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...
- [NOIP模拟测试34]反思+题解
不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...
- [NOIP模拟测试32]反思+题解
又考挂了QAQ 总rank直接滑出前20 晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了. T1一眼推柿子,然而并没有头绪所以先码了个暴力.然后…… 一个垃圾暴力我调了1h,大概解决了两位数 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- NOIP模拟测试7
期望得分:60+60+60 实际得分:60+60+0 这次考试主要是T3搜索打挂了(我可是靠搜索吃饭的); 1.数组开小了,不过开大数组只拿到了10分的好成绩. 2.题意没审清(其实是他没说清). 以 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
随机推荐
- USB驱动程序设计
1.USB驱动模型 ①USB HOST控制器驱动 ②USBhexin ③USB客户端驱动 设备4个层次:设备(device).配置(Config).接口(Interface).端点(Endpoint) ...
- Qt的信号和槽机制
一.信号和槽机制 信号和槽用于两个对象之间的通信,我们希望任何对象都可以和其他对象进行通信. 当一个特殊的事情发生时便可以发射一个信号,而槽就是一个函数,它在信号发射后被调用来相应这个信号.( ...
- SQL中循环的实现方式
一.第一种方法,游标 定义游标 DECLARE cur_ClubHeadCash CURSOR FAST_FORWARD READ_ONLY FOR,循环每行 FETCH NEXT FROM cur_ ...
- Java奇葩笔试题
1.下面代码中,在if处填写什么代码,可以使得输出结果为:AB 1 2 3 4 5 6 7 8 9 public static void main(String[] args) { if ( ){// ...
- 软件-平面设计-CorelDRAW:CorelDRAW
ylbtech-软件-平面设计-CorelDRAW:CorelDRAW CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件:该软件是Corel公司出品的矢量图形制作工 ...
- linux 下安装与使用
一 安装 ## 先用wget下载源文件 wget http://download.redis.io/releases/redis-3.2.9.tar.gz ## 我自己建个文件夹 mkdir /usr ...
- Python 如何debug
一.常见错误: 1.漏了末尾的冒号,如 if语句,循环语句,定义函数 2.缩进错误,该缩进的时候没有缩进 3.把英文符号写成中文符号,如: ' ' () , 4.字符串拼接,把字符串和数字拼接一起 ...
- 35-python基础-python3-字符串修改大小写的方法-title()方法-lower()方法-upper()方法
1-title()-注:不是原地修改,有返回值 以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写. 2-lower()和upper()-注:不是原地修改,有返回值 将字符串改为全部小写或 ...
- docker--删除container和image
docker的命令分两类Management Commands和Commands Management Commands是对docker里的对象进行管理的 [root@localhost docker ...
- collections库的namedtuple+pytest的使用
from collections import namedtupleTask=namedtuple('Task',['summary','owner','done','id'])Task.__new_ ...