模拟7题解 T2visit
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的更多相关文章
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- 10.8 wtx模拟题题解
填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 【洛谷】xht模拟赛 题解
前言 大家期待已久并没有的题解终于来啦~ 这次的T1和HAOI2016撞题了...深表歉意...表示自己真的不知情... 天下的水题总是水得相似,神题各有各的神法.--<安娜·卡列妮娜> ...
- 10.9 guz模拟题题解
感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...
随机推荐
- Installer - win10安装及卸载SQL Server2008数据库
一.数据库安装环境 操作系统:win10 SQL server:SQL server 2008 R2 二.全新数据库安装 1.安装扩展文件 双击安装文件,弹出如下窗体: ...
- PageRank算法R语言实现
PageRank算法R语言实现 Google搜索,早已成为我每天必用的工具,无数次惊叹它搜索结果的准确性.同时,我也在做Google的SEO,推广自己的博客.经过几个月尝试,我的博客PR到2了,外链也 ...
- Linux 日期时间命令
cal : 显示日历 -1 显示一个月的月历 -3 显示系统前一个月,当前月,下一个月的月历 -s 显示星期天为一个星期的第一天,默认的格式 -m 显示星期一为一个星期的第一天 -j 显示在当年中 ...
- [NOI2003]逃学的小孩【观察+树的直径】
Online Judge:Bzoj1509,Luogu P4408 Label:观察,树的直径 题目描述 输入 第一行是两个整数N(\(3≤N≤200000\))和M,分别表示居住点总数和街道总数.以 ...
- ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle
https://haoqchen.site/2018/04/28/ROS-node-init/ #include "ros/ros.h" #include <signal.h ...
- 19-10-15-Night-E
信心赛??高考赛…… 过程 T1码了暴力+随机化. T2没码完.$Kuku$了 T3写了暴力+ puts("86400\n-1"); 骗了点分. T1 ××你告诉我CF E题是T1 ...
- 【Redis安装】部署与基本配置 --基于Mac和Linux
Redis安装与部署[基于Mac和Linux] 一.Redis简介 基于内存的Key-Value高性能NoSQL数据库 二.Redis下载和解压 进入官网下载最新版的Redis,目前是5.0.0,这个 ...
- node.js 安装步骤
1.打开链接(http://nodejs.cn/download/) 2.下载自己所需的安装包(32位 or 64位.哪个系统) 3.双击直接安装(成功如下图) 4.点击 Node.js comman ...
- 60行JavaScript代码俄罗斯方块
教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏 早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下( ...
- 关于Cocos2d-x多线程异步载入资源的问题
我们通常使用CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("xxx.plist" ...