T2 visit

[组合数学][中国剩余定理]

一场考试难得见两个数学题

本来想矩阵快速幂,显然空间复杂度不行,主要是没时间,就没打

正解:

首先推波式子

1.$C_{t}^{k}$    在t步中总共选出k步向上走,但最终只会走到m,到达m后,会又向下走k-m步,并会再向上走k-m步

2.$C_{t-k}^{k-m}$  在剩下的t-k步中选出向下走的k-m步

3. 先介绍一个小技巧:eg  10 分成两个数,使两数之和为10,之差为4,

                 则大数(10+4)/2=7,小数(10-4)/2=3

 $C_{t-2k+m}^{\frac{t-2k+m+n}{2}}$    此时还剩t-k-(k-m)=t-2k+m 步,这些用来分给向左和右的步数,因为最终要向右到n

              所以向右的总步数-向左的总步数=n,由以上技巧

          t-2k+m是和,n是差,相加再/2是就是向右的步数

             在$t-2k+m$中选出向右的$\frac{t-2k+m+n}{2}$步数

用向上,下,和左右的组合数相乘得到总步数

关键是k的范围:首先k>=m,否则上不去,

        同理向右的$\frac{t-2k+m+n}{2}$>=n

        联立解得$k\in[m,\frac{t+m-n}{2}]$

合起来:$\sum\limits_{k=m}^{\frac{t+m-n}{2}}(C_{t}^{k}\times C_{t-k}^{k-m}\times C_{t-2k+m}^{\frac{t-2k+m+n}{2}})$

如何实现?

1.对于mod是质数的情况,直接 预处理+lucas定理

2.若mod是由若干个质数相乘得到,将mod分解质因数,

对于每个质因子q[i],原式对其取模得到的结果就是其余数,记做b[i]

那么问题就转化成了最终结果ans≡b[i](%p[i]) 在%mod情况下的线性同余方程组,用CRT求解即可

负数的情况变成正的来处理

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#define int long long
using namespace std;
const int maxn=;
int t;
vector<int>q;
int exgcd(int a,int b,int &x,int &y)
{
if(!b){x=,y=;return a;}
int d=exgcd(b,a%b,x,y);
int tmp=x;x=y;y=tmp-(a/b)*y;
return d;
}
int b[maxn+];
int crt(int mod)
{
int ans=;
for(int i=;i<q.size();i++)
{
int tmp=mod/q[i],x,y;
exgcd(tmp,q[i],x,y);
ans=(ans+tmp*x*b[i])%mod;
}
return (ans%mod+mod)%mod;
}
int inv[maxn+],fac[maxn+];
void init(int mod)
{
fac[]=fac[]=;
inv[]=inv[]=;
for(int i=;i<=t;i++)
{
fac[i]=fac[i-]*i%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=;i<=t;i++)
inv[i]=inv[i-]*inv[i]%mod;
}
int C(int n,int m,int mod)
{
if(m>n) return ;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int lucas(int n,int m,int mod)
{
if(!m) return ;
return lucas(n/mod,m/mod,mod)*C(n%mod,m%mod,mod)%mod;
}
void divide(int n)
{
for(int i=;i<=sqrt(n);i++)
{
if(n%i)continue;
q.push_back(i);
n/=i;
}
if(n>)q.push_back(n);
}
signed main()
{
int ans=,n,m,mod;
scanf("%lld%lld%lld%lld",&t,&mod,&n,&m);
if(n<)n=-n;
if(m<)m=-m;
divide(mod);
int st=m,en=(t+m-n)>>;
if(q.size()==)
{
init(mod);
for(int k=st;k<=en;k++)
ans=(ans+lucas(t,k,mod)*lucas(t-k,k-m,mod)%mod*lucas(t-*k+m,(t-*k+m+n)>>,mod)%mod)%mod;
printf("%lld\n",ans);
return ;
}
for(int i=;i<q.size();i++)
{
init(q[i]);
for(int k=st;k<=en;k++)
b[i]=(b[i]+lucas(t,k,q[i])*lucas(t-k,k-m,q[i])%q[i]*lucas(t-*k+m,(t-*k+m+n)>>,q[i])%q[i])%q[i];
}
printf("%lld\n",crt(mod));
}

组合数取模

模拟7题解 T2visit的更多相关文章

  1. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  2. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  3. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  4. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  5. 10.8 wtx模拟题题解

    填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...

  6. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  7. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  8. 【洛谷】xht模拟赛 题解

    前言 大家期待已久并没有的题解终于来啦~ 这次的T1和HAOI2016撞题了...深表歉意...表示自己真的不知情... 天下的水题总是水得相似,神题各有各的神法.--<安娜·卡列妮娜> ...

  9. 10.9 guz模拟题题解

    感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...

随机推荐

  1. Cesium官方教程10--高级粒子特效

    原文地址:https://cesiumjs.org/tutorials/Particle-Systems-More-Effects-Tutorial/ 高级粒子系统特效 这篇教程学习更多的效果,包括天 ...

  2. 设置和修改Linux的swap分区大小

    在Linux编译gcc时,遇到编译错误,究其根源是因为内存不足,这时通过修改swap大小解决了问题 相关操作如下: 1. 查看当前分区情况free -m 2. 增加 swap 大小, 2G 左右dd ...

  3. Hadoop构架概览

    hadoop是一个开源的软件框架,是一个利用商业硬件处理和存储大型数据的软件.从下到上主要有五个主要的组成部分: 集群,是一套主机(节点)组成的.节点可以以机架划分.这个是硬件级别的构架. YARN构 ...

  4. 关于MySQL IN LIKE OR使用索引的问题

    以前在网上看了一些资料,有些人说话不严谨,导致一直被误导,最近在实际开发中发现一些结论有问题,因此特地整理了一下,防止下次继续犯错. 以下前提是有对这个字段建立索引(简直废话,没建的肯定不会使用索引啊 ...

  5. python—时间与时间戳之间的转换

    python-时间与时间戳之间的转换 对于时间数据,如2016-05-05 20:28:54,有时需要与时间戳进行相互的运算,此时就需要对两种形式进行转换,在Python中,转换时需要用到time模块 ...

  6. android服务的bindService/startService

    1,高版本android已经不允许只通过action来bindService/startService,可以通过: intent.setPackage("XXXX"); 来指定服务 ...

  7. spring中关于<context:component-scan>的使用说明

    通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描 ...

  8. win10x软件字体有阴影很模糊的解决方法(软件分辨率与系统分辨率不一致)

    devC++,百度网盘等软件都有这种情况 拿百度网盘举例:界面比较大,不能缩小,字体有阴影比较模糊 解决方法: 桌面右击百度网盘,选择属性, 点击兼容性,更改高DPI设置,替代高DPI缩放行为前面打上 ...

  9. Leetcode443.String Compression压缩字符串

    给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: ...

  10. Jdbc封装和对CURD的封装

    1.查询emp表中的所有记录为例 2.测试类 public Emp getByNameAndEmail(String name, String email){ String sql = "s ...