【模拟7.22】visit(卢卡斯定理&&中国剩余定理)
如此显然的组合数我把它当DP做,我真是。。。。
因为起点终点已经确定,我们发现如果我们确定了一个方向的步数其他方向也就确定了
组合数做法1:
设向右走了a步,然后向左走了b=a-n步,设向上为c,向下为d;
c+d=t-a-b; c-d=m;
求出c=(t+n+m-i-i)/2;if(c%2)continue;
(因为如果c不能整除2表示向右多走的步数无法走回)
组合数做法2:
参考nc神犇的做法
首先设水平方向一共走了i步,所以(i-n)/2为水平方向上返回的步数,
竖直方向上步数t-i,中同理返回的是(t-i-m)/2;
式子C(t,i)*C(i,(i-n)/2)*C(t-i,(t-i-m)/2)
(因为竖直方向+水平方向步数=t,所以不用乘C(t-i,t-i))
我们发现数据为多个质数乘积,显然可以用中国剩余定理求解,当然要提前分解质因数
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<algorithm>
6 #include<cmath>
7 #include<stack>
8 #include<vector>
9 #include<queue>
10 #define MAXN 100001
11 #define ps push_back
12 #define ll long long
13 using namespace std;
14 vector<int>su;ll jie[MAXN];
15 void fen(int x)
16 {
17 for(int i=2;i<=sqrt(x);++i)
18 {
19 if(x%i==0)
20 {
21 while(x%i==0)
22 {
23 x/=i;
24 }
25 su.ps(i);
26 }
27 }
28 if(x!=1)
29 {
30 su.ps(x);
31 }
32 }
33 ll pow(ll x,ll y,ll mod)
34 {
35 ll ans=1;
36 if(y==0)return 1;
37 while(y)
38 {
39 if(y&1)ans=ans*x%mod;
40 x=x*x%mod;
41 y>>=1;
42 }
43 return ans%mod;
44 }
45 ll C(ll x,ll y,ll mod)
46 {
47 if(y>x)return 0;
48 if(y==0)return 1;
49 return jie[x]*pow(jie[y]*jie[x-y]%mod,mod-2,mod)%mod;
50 }
51 ll lus(ll x,ll y,ll mod)
52 {
53 if(y>x)return 0;
54 if(y==0)return 1;
55 return lus(x/mod,y/mod,mod)*C(x%mod,y%mod,mod)%mod;
56 }
57 ll M[MAXN],ans[MAXN];
58 void exgcd(ll a,ll b,ll &x,ll &y)
59 {
60 if(b==0){
61 x=1;y=0;return ;
62 }
63 exgcd(b,a%b,x,y);
64 ll z=x;x=y;y=z-(a/b)*y;
65 return ;
66 }
67 ll sum;ll len=1;
68 void CRT()
69 {
70 for(ll i=0;i<su.size();++i)
71 {
72 len*=su[i];
73 //printf("%lld\n",len);
74 }
75 for(ll i=0;i<su.size();++i)
76 {
77 M[i]=len/su[i];
78 }
79 for(ll i=0;i<su.size();++i)
80 {
81 ll x,y;
82 exgcd(M[i],su[i],x,y);
83 x=(x+su[i])%su[i];
84 sum=(sum+ans[i]*M[i]*x)%len;
85 //printf("sum=%lld ans=%lld M=%lld x=%lld\n",sum,ans[i],M[i],x);
86 }
87 printf("%lld\n",sum);
88 }
89 ll t;
90 void fir(ll mod)
91 {
92 for(ll i=1;i<=min(mod,t);++i)
93 {
94 jie[i]=(jie[i-1]*i)%mod;
95 }
96 }
97 ll MOD,n,m;
98 int main()
99 {
100 scanf("%lld%lld",&t,&MOD);
101 scanf("%lld%lld",&n,&m);
102 if(n<0)n=-n;
103 if(m<0)m=-m;
104 jie[0]=1;
105 fen(MOD);
106 for(ll k=0;k<su.size();++k)
107 {
108 fir(su[k]);
109 ll mod=su[k];
110 //printf("mod=%lld\n",mod);
111 for(ll i=n;i<=t-m;++i)
112 {
113 ll a=i;
114 ll b=i-n;
115 ll c=(t+n+m-i-i);
116 if(c%2!=0)continue;c/=2ll;
117 ll d=t-a-b-c;
118 ans[k]=(ans[k]+lus(t,a,mod)*lus(t-a,b,mod)%mod*lus(t-a-b,c,mod)%mod+mod)%mod;
119 }
120 }
121 CRT();
122 }
【模拟7.22】visit(卢卡斯定理&&中国剩余定理)的更多相关文章
- ACM-ICPC 2015 Changchun Preliminary Contest J. Unknown Treasure (卢卡斯定理+中国剩余定理)
题目链接:https://nanti.jisuanke.com/t/A1842 题目大意:给定整数n,m,k,其中1≤m≤n≤1018,k≤10, 然后给出k个素数,保证M=p[1]*p[2]……*p ...
- 洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)
传送门 好吧我数学差的好像不是一点半点…… 题目求的是$G^{\sum_{d|n}C^d_n}mod\ 999911659$ 我们可以利用费马小定理$a^{k}\equiv a^{k\ mod\ (p ...
- 【Lucas组合数定理+中国剩余定理】Mysterious For-HDU 4373
Mysterious For-HDU 4373 题目描述 MatRush is an ACMer from ZJUT, and he always love to create some specia ...
- hdu 5446(2015长春网络赛J题 Lucas定理+中国剩余定理)
题意:M=p1*p2*...pk:求C(n,m)%M,pi小于10^5,n,m,M都是小于10^18. pi为质数 M不一定是质数 所以只能用Lucas定理求k次 C(n,m)%Pi最后会得到一个同余 ...
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)
题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...
- 逆元 exgcd 费马小定理 中国剩余定理的理解和证明
一.除法取模逆元 如果我们要通过一个前面取过模的式子递推出其他要取模的式子,而递推式里又存在除法 那么一个很尴尬的事情出现了,假如a[i-1]=100%31=7 a[i]=(a[i-1]/2)%31 ...
- hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- CCNA 第二章 以太网回顾
1:半双工和全双工 (1):半双工:类似于单车道: (2):全双工:类似是双向多车道: 2:思科三层模型 (1): (2):核心层.集散层(汇聚层).接入层各功能: 1:核心层:大量数据快速交换:不要 ...
- HashSet添加操作底层判读(Object类型)
Object类型添加操作判读 第一步:程序首先创建一个Object泛型的Set数组,这里用到了上转型: 第二步:执行object里面的add添加方法,传进的值为"JAVA": 首先 ...
- Visual Lab Online —— Beta版本发布声明
项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Beta阶段发布声明 发布声明 目录 发布方式.发布地址与运行环境要求 软件主体 浏览器扩展 Beta版本新功能 登录注册页 注册时邮箱 ...
- Serverless实践-静态网站托管
Serverless实践-静态网站托管 超多图预警!!! 本文旨在帮助不懂运维/网络/服务器知识的小白,在不租用云服务器的情况下,实现Web站点的上线部署 适合边看文章边跟着动手做 包含使用Githu ...
- docker-compose如何动态配置springboot项目的application.yml的配置
假如我们再springboot的工程中有配置文件 方式1: application.properties里面存在环境变量: #配置数据库链接 spring.datasource.url = jdbc: ...
- 解决nohup: 忽略输入并把输出追加到"nohup.out"或者nohup: 忽略输入重定向错误到标准输出端
nohup启动脚本的时候,没有指定输出路径,默认使用当前目录的nohup.out 例如下面这句就是默认使用nohup.out作为输出文件: nohup script.sh & 改成下面的,则/ ...
- MyBatis 高级查询之多对多查询(十一)
高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...
- IDEA 配置 Tomcat(详细)(Day_12)
如果这世界上真有奇迹,那只是努力的另一个名字.生命中最难的阶段,不是没有人懂你,而是你不懂你自己. 运行环境 AND 版本 JDK8 + IntelliJ IDEA 2018.3 + Tomca ...
- MVC、MVP和MVVM的区别
前言 在web1.0时代时,那个时候程序猿还没有前后端之分,更程序员开发的时候,都是要前后端一起写的,前后端的代码都是杂揉在一起,如图下 这种开发模式的话,开发的时候因为不需要和其他人员沟通协作,前后 ...
- openresty 学习笔记番外篇:python访问RabbitMQ消息队列
openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...