扩展CRT +扩展LUCAS
再次感谢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的更多相关文章
- LOJ.2721.[NOI2018]屠龙勇士(扩展CRT 扩展欧几里得)
题目链接 LOJ 洛谷 rank前3无压力(话说rank1特判打表有意思么) \(x*atk[i] - y*p[i] = hp[i]\) 对于每条龙可以求一个满足条件的\(x_0\),然后得到其通解\ ...
- 扩展crt
题解: 很久之前写过一篇..但好像写的不太正常 就重新写一篇 对于质数有一种朴素的crt合并 但其实那个没啥用..那个能做的扩展crt都能做 并且那个好像不能动态加方程组 所以就会扩展crt就行了 扩 ...
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- 扩展中国剩余定理(扩展CRT)详解
今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...
- 中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前 ...
- NOI2018屠龙勇士(扩展CRT + splay(multiset))
QWQ 一到假期就颓废 哎 今年新鲜出炉的NOI题,QwQ同步赛的时候写的,后来交了一发洛谷,竟然过了 首先 根据题目,我们很容易得到,假设对应每一条龙的剑的攻击力是\(atk\)的话 \[a_i-x ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 编译安装PHP7并安装Redis扩展Swoole扩展
编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...
- 扩展javascript扩展(类,对象,原型)
扩展javascript扩展(类,对象,原型)
随机推荐
- WPF:DropShadowEffect 生效
1.BorderThickness = “XX”,xx可以当作阴影四周的宽度 2.BorderBrush="Transparent"
- [Android][Recovery] Recovery下找不到sdcard路径
做升级的时候,把更新包拷贝到sd卡中,然后调用接口进行重启升级 wossoneri.github.io File update_file = new File("/sdcard/update ...
- Docker 创建 Confluence6.12.2 中文版
目录 目录 1.介绍 1.1.什么是Confluence? 2.Confluence的官网在哪里? 3.如何下载安装? 4.对 Confluence 进行配置 4.1.设置 Confluence 4. ...
- EF ORM
//新增 UserInfo userInfo = new UserInfo(); userInfo.UserName = "YANG"; userInfo.UserPass = & ...
- c/c++ 重载运算符 类型转换运算符
重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...
- Cs231n课堂内容记录-Lecture 9 深度学习模型
Lecture 9 CNN Architectures 参见:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_ ...
- Python面试笔记一
目录 一.MySQL(30题) 二.django(15题) 三.Python部分(46题) 四.RESTful API设计指南(7题) 五.补充 一.MySQL(30题) 1.mysql如何做分页 m ...
- Django-CRM项目学习(三)-stark的页面展示
开始今日份整理,主要为stark组件的增删改以及model_form组件的使用以及form组件的回顾 1.list_display_link功能 功能:客制化字段进行跳转到指定的页面(编辑页面) 1. ...
- 12-tinyMCE文本编辑器+图片上传预览+页面倒计时自动跳转
文本编辑器插件:1.将tinymce文件夹全部复制到webContent下2.tinymce/js目录下放 jquery等三个js文件3.语言包:tinymce/js/tinymce/langs目录下 ...
- keras 中模型的保存
参考:https://www.cnblogs.com/weiyinfu/p/9788179.html#0 1.model.summary() 这个函数会打印模型结构,但是仅仅是打印到控制台,不能保存 ...