再次感谢zyf2000超强的讲解。

扩展CRT其实就是爆推式子,然后一路合并,只是最后一个式子上我有点小疑惑,但整体还算好理解。

#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
#include<algorithm>
#include<vector>
#include<bitset>
#include<set>
#include<cstring>
#include<string>
#define ll long long
#define pb push_back
#define _mp make_pair
#define db double
#define eps 1e-9
#define inf 1e9
using namespace std;
const int maxn=1e5+7;
const int maxm=100005;
const int mod=1e9+7;
inline ll read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll x,y;
ll m[maxn],c[maxn];
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;y=0;return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
return;
}
ll inv(ll a,ll b)
{ exgcd(a,b,x,y);
x=(x%b+b)%b;
if(!x)x+=b;
return x;
}
int main()
{
int t;
while(~scanf("%d",&t))
{
for(int i=1;i<=t;i++)
{
m[i]=read();c[i]=read();
}
int flag=1;
for(int i=2;i<=t;i++)
{
ll m1=m[i-1],m2=m[i],c1=c[i-1],c2=c[i];
ll tt=gcd(m1,m2);
if((c2-c1)%tt!=0)
{
flag=0;
break;
}
m[i]=m1*m2/tt;
c[i]=inv(m1/tt,m2/tt)*(c2-c1)/tt%(m2/tt)*m1+c1;
c[i]=(c[i]%m[i]+m[i])%m[i];
}
if(!flag)cout<<"-1\n";
else cout<<c[t]<<"\n";
}
}

 扩展LUCAS里面涉及的东西就比较多了,首先质因数分解转换为一个同余模方程,然后将阶乘中的pi的因子拿掉算一算,最后再加回来,最后显然可以按照CRT去合并,看博客看得懂,不过想为什么就比较难了,要注意有pk的循环节,然后会有没有算的部分要暴力枚举(就是循环节之外的那几个数),因为不一定是整除的。PS:这个模板题我因为read()写错导致了WA了一小时,改的和别人一模一样都是WA,然后仔细读了一下发现read()里的x必须写ll。。。。。我真是个智障。

#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
#include<algorithm>
#include<vector>
#include<bitset>
#include<set>
#include<cstring>
#include<string>
#define ll long long
#define pb push_back
#define _mp make_pair
#define db double
using namespace std;
const int maxn=1e5+7;
const int maxm=100005;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll x,y,ans,n,m;
ll Mod;
ll q_pow(ll a,ll p,ll mod)
{
ll ans=1LL;
for (;p;p>>=1,a=a*a%mod)
if (p&1)
ans=ans*a%mod;
return ans;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1ll;y=0ll;return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
ll inv(ll a,ll b)
{
if(!a)return 0ll;
//ll a=A,b=t,x=0ll,y=0ll;
//cout<<b<<" ";
x=0ll,y=0ll;
exgcd(a,b,x,y);
//cout<<b<<endl;
x=((x%b)+b)%b;
if(!x)x+=b;
return x;
}
ll mul(ll n,ll pi,ll pk)
{
if(!n)return 1ll;
ll ans=1ll;
if(n/pk)
{
for(ll i=2;i<=pk;i++)
{
if(i%pi)ans=ans*i%pk;
}
ans=q_pow(ans,n/pk,pk);
}
for(ll i=2;i<=n%pk;i++)
{
if(i%pi)ans=ans*i%pk;
}
return ans*mul(n/pi,pi,pk)%pk;
}
ll c(ll n,ll m,ll pi,ll pk)
{
if(m>n)return 0ll;
ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk);
ll cnt=0ll,ans;
for(ll i=n;i;i/=pi)cnt+=i/pi;
for(ll i=m;i;i/=pi)cnt-=i/pi;
for(ll i=n-m;i;i/=pi)cnt-=i/pi;
ans=a*inv(b,pk)%pk*inv(c,pk)%pk*q_pow(pi,cnt,pk)%pk;
return ans*(Mod/pk)%Mod*inv(Mod/pk,pk)%Mod;
}
int main()
{
n=read();m=read();Mod=read();
ll tt=Mod;
for(ll i=2;i<=Mod;i++)
{
if(tt%i==0)
{
ll ps=1ll;
while(tt%i==0)tt/=i,ps*=i;
ans=(ans+c(n,m,i,ps))%Mod;
}
}
cout<<ans<<"\n"; }

 然后CRT、LUCAS的代码就不贴了,反正众所周知,做完模板题一般是没什么用的,所以做题的时候就会看到他们了。

扩展CRT +扩展LUCAS的更多相关文章

  1. LOJ.2721.[NOI2018]屠龙勇士(扩展CRT 扩展欧几里得)

    题目链接 LOJ 洛谷 rank前3无压力(话说rank1特判打表有意思么) \(x*atk[i] - y*p[i] = hp[i]\) 对于每条龙可以求一个满足条件的\(x_0\),然后得到其通解\ ...

  2. 扩展crt

    题解: 很久之前写过一篇..但好像写的不太正常 就重新写一篇 对于质数有一种朴素的crt合并 但其实那个没啥用..那个能做的扩展crt都能做 并且那个好像不能动态加方程组 所以就会扩展crt就行了 扩 ...

  3. BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set

    题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...

  4. 扩展中国剩余定理(扩展CRT)详解

    今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...

  5. 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结

    中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...

  6. NOI2018屠龙勇士(扩展CRT + splay(multiset))

    QWQ 一到假期就颓废 哎 今年新鲜出炉的NOI题,QwQ同步赛的时候写的,后来交了一发洛谷,竟然过了 首先 根据题目,我们很容易得到,假设对应每一条龙的剑的攻击力是\(atk\)的话 \[a_i-x ...

  7. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  8. 编译安装PHP7并安装Redis扩展Swoole扩展

    编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...

  9. 扩展javascript扩展(类,对象,原型)

     扩展javascript扩展(类,对象,原型)

随机推荐

  1. WPF:DropShadowEffect 生效

    1.BorderThickness = “XX”,xx可以当作阴影四周的宽度 2.BorderBrush="Transparent"

  2. [Android][Recovery] Recovery下找不到sdcard路径

    做升级的时候,把更新包拷贝到sd卡中,然后调用接口进行重启升级 wossoneri.github.io File update_file = new File("/sdcard/update ...

  3. Docker 创建 Confluence6.12.2 中文版

    目录 目录 1.介绍 1.1.什么是Confluence? 2.Confluence的官网在哪里? 3.如何下载安装? 4.对 Confluence 进行配置 4.1.设置 Confluence 4. ...

  4. EF ORM

    //新增 UserInfo userInfo = new UserInfo(); userInfo.UserName = "YANG"; userInfo.UserPass = & ...

  5. c/c++ 重载运算符 类型转换运算符

    重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...

  6. Cs231n课堂内容记录-Lecture 9 深度学习模型

    Lecture 9 CNN Architectures 参见:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_ ...

  7. Python面试笔记一

    目录 一.MySQL(30题) 二.django(15题) 三.Python部分(46题) 四.RESTful API设计指南(7题) 五.补充 一.MySQL(30题) 1.mysql如何做分页 m ...

  8. Django-CRM项目学习(三)-stark的页面展示

    开始今日份整理,主要为stark组件的增删改以及model_form组件的使用以及form组件的回顾 1.list_display_link功能 功能:客制化字段进行跳转到指定的页面(编辑页面) 1. ...

  9. 12-tinyMCE文本编辑器+图片上传预览+页面倒计时自动跳转

    文本编辑器插件:1.将tinymce文件夹全部复制到webContent下2.tinymce/js目录下放 jquery等三个js文件3.语言包:tinymce/js/tinymce/langs目录下 ...

  10. keras 中模型的保存

    参考:https://www.cnblogs.com/weiyinfu/p/9788179.html#0 1.model.summary() 这个函数会打印模型结构,但是仅仅是打印到控制台,不能保存 ...