博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3868 [TJOI2009]猜数字
阅读量:5142 次
发布时间:2019-06-13

本文共 1190 字,大约阅读时间需要 3 分钟。

中国剩余定理模板题(关于中国剩余定理,我是在这里学的:)

由题可知:

  n-ai=k*bi  --->  n-ai ≡ 0 (mod bi)  --->  n≡ai (mod bi)

直接用中国剩余定理解同余方程组就好了

注意一些坑点:

1. ai可能为负

因为 ai 是在模 bi 意义下的,所以可以很容易地转成正数: ai=(ai%bi+bi)%bi

2. 相乘过程中会爆 long long

这时我们要用神奇的O(1)快速乘... 当然你要用龟速乘也可以...

具体看代码

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;ll mo=1;inline ll ksc(ll x,ll y)//O(1)快速乘{ ll tmp=(x*y-(ll)((long double)x/mo*y+1.0e-8)*mo); return tmp<0 ? tmp+mo : tmp;}void exgcd(ll a,ll b,ll &x,ll &y){ if(!b) { x=1,y=0; return; } exgcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*y;}const int N=107;ll a[N],b[N],ans,n,x,y;ll China(){ for(int i=1;i<=n;i++) mo*=b[i]; for(int i=1;i<=n;i++) { ll m=mo/b[i]; exgcd(m,b[i],x,y); if(x<0) x=(x%b[i]+b[i])%b[i]; ans=(ans+ksc( ksc(x,a[i]) , m) )%mo; } if(ans<0) ans=ans+mo;//注意答案的符号 return ans;}int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; for(int i=1;i<=n;i++) a[i]=(a[i]%b[i]+b[i])%b[i];//注意转成正数 cout<

 

转载于:https://www.cnblogs.com/LLTYYC/p/9778969.html

你可能感兴趣的文章
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
OpenFire 的安装和配置
查看>>
ZJOI2018游记Round1
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
ios应用版本号设置规则
查看>>
海上孤独的帆
查看>>
error: more than one device and emulator 问题解决
查看>>
Java基础:容器
查看>>
YUV摘要格式
查看>>
【方法2】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
查看>>
C# CheckedListBox控件的使用方法
查看>>
【HDOJ】2007平方和与立方和
查看>>
SharePoint自定义程序页面部署 不用重启IIS
查看>>
2014-11-30-2333-Java-数组
查看>>
Nginx 自动补全url地址补全最后的斜线
查看>>
【SQL Server 2008 安装全过程】
查看>>
xml的解析及案例的分析和分享
查看>>