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 }

原文地址:https://www.cnblogs.com/Wwb123/p/11231016.html

时间: 2024-11-01 23:45:37

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[k]≤1018,p[i]≤105 求C(n,m)%(p[1]*p[2]……*p[k]) 解题思路:因为模数太大,所以我们先用卢卡斯定理求出对每个素数的模,然后再通过中国剩余定理就可以求得对它们的乘积的模. 代码: #include<bits/stdc++.h> using namespace s

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最后会得到一个同余方程组x≡B[0](mod p[0])x≡B[1](mod p[1])x≡B[2](mod p[2])......解这个同余方程组 用中国剩余定理 Sample Input19 5 23 5 Sample Output6 1 # include <iostream> 2 # include <

SDOI 2010--古代猪文(Lucas算法&amp;费马小定理&amp;中国剩余定理)

发现几乎每次数论题洛谷总是让我TLE一个点.... 附图: 最后那个点优化了很久终于过了.... 题意 iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会很大.当时的猪王国国王考虑到如果修一本字典,规模有可能远远超过康熙字典,花费的猪力.物力将难以估量.故考虑再三没有进行这一项劳猪伤财之举.当然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不常用的字. iPig打算研究古时某个朝代的猪文文字.根据相关文献记载,那个朝代流传的猪

Lucas定理 中国剩余定理 数论

逆元: 若 a*b=1(%p) 则a是b在%p意义下的逆元.  则在%p意义下  一个数 除以a就等价于乘b 两种求逆元方法:1.若p为质数时,则有性质则a^(p-1)=1(%p) .   即a*a^(p-2)=1(%p).   所以a的逆元就是a^(p-2)  2.exgcd(a,b,x,y) 可求 ax+by=c=gcd(a,b)  若a,b互质 则可求a%b下的逆元 Lucas定理:{ 求C(n,m)在%p下的值    (p是质数)    -- Lucas(n,m,p)=c(n%p,m%p

hdu 5446 Unknown Treasure (Lucas定理+中国剩余定理+快速乘)

题意:c( n, m)%M    M = P1 * P2 * ......* Pk (其中Pk是素数) 思路:Lucas定理中C(n,m)%M,M必须是素数,当M不是素数时,我们可以把它拆成素数的乘积 如果x=C(n,m)%M ,M=p1*p2*..*pk;  a[i]=Lucas(n,m)%pi: xΞa[1](mod p1) xΞa[2](mod p2) ... xΞa[k](mod pk) 用中国剩余定理就可以把x求出来 注意到这道题ll*ll 由于计算机底层设计的原因,做加法往往比乘法快

hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)

X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8416    Accepted Submission(s): 3066 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod

【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】[BZOJ 1951] 古代猪文

[Description] 求 [Solution] 容易得到, 所以,重点在怎么求 如果是p-1是个质数,我们可以用sqrt(n)的时间枚举所有d,用Lucas定理分别计算求和即可. 但是我们发现p-1=2*3*4679*35617,并不是一个质数,所以Lucas定理不能用了吗?并不,我们可以算出这个合式分别对2.3.4679.35617的模值,写出四个同余方程,再用孙子定理求解即可.注意特判g==p的情况,此时费马小定理不成立,ans=0. [Code] #include<cmath> #

hdu3579-Hello Kiki-(扩展欧几里得定理+中国剩余定理)

Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5489    Accepted Submission(s): 2164 Problem Description One day I was shopping in the supermarket. There was a cashier counting coins

中国剩余定理与扩展中国剩余定理

中国剩余定理(CRT) 我好蔡啊 不学这个东东我连任意模数\(NTT\)都学不了 问题 中国剩余定理用于求解同余方程组 \[ \left\{ \begin{aligned} x≡a_1(\mod m_1)\x≡a_2(\mod m_2)\......\x≡a_k(\mod m_k) \end{aligned} \right. \] 其中\(m_1,m_2,...,m_k\)两两互质 求\(x\)的最小非负整数解 定理 令\(M=\prod_{i=1}^km_i\),也就是它们的最小公倍数 设\(