[TJOI2009]猜数字
时间:2019-08-19
本文章向大家介绍[TJOI2009]猜数字,主要包括[TJOI2009]猜数字使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[TJOI2009]猜数字
中国剩余定理+龟速乘
这个大概就是中国剩余定理的板子题了啊。。。
中国剩余定理:
问题:
若\(m_1,m_2...m_n,\)是两两互质的正整数,
求解线性同余方程组:
\[f(n)=\begin{cases} x\equiv a_1\pmod {m_1}\\ x\equiv a_2\pmod {m_2}\\ ... ...\\ x\equiv a_n\pmod {m_n}\\ \end{cases}\]
的解\(x\)。
解法:
设\(M=\prod_{i=1}^n,M_i=M/m_i\)
\(t\)是同余方程\(M_it_i\equiv 1\pmod {m_i}\)的一个解
然后答案就是
\[x=\sum_{i=1}^n a_im_it_i\]
证明:
因为\(M_i\)是处\(m_i\)外所有数的倍数,所以
\[\forall k\not=i,a_iM_it_i\equiv 0\pmod {m_k}\]
而且
\[a_iM_it_i\equiv a_i\pmod {m_i}\]
\[x=\sum_{i=1}^na_iM_it_i\]
原方程成立。
通解:
\[x=\sum_{i=1}^n a_im_it_i\]
是问题的一个特殊解,通解为
\[x+kM(k\in Z)\]
证明:
显然(大雾)
龟速乘:
\(O(logn)\)的其他题解里都有,很好理解,就不说了。
\(O(1)\)的龟速乘:
当两个数乘起来爆 long long 的时候,需要用快速乘,虽然O(1)的比O(logn)的快了许多,但是他还是没有普通乘快,所以我叫他龟速乘qwq
Code
inline ll qmul(ll x,ll y,ll mod)
{
x%=mod;y%=mod;
return ((x*y-(ll)(((long double)x*y+0.5)/mod)*mod)%mod+mod)%mod;
}
这个。。。也挺好理解啊,而且也没法解释啊qwq可意会不可言传
然后就是打板子了emmmm
Code
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 1e5+1;
ll n,ans;
ll M=1,Mi,a[N],m[N];
inline void file()
{freopen("text.in","r",stdin);freopen("text.out","w",stdout);}
inline void closefile()
{fclose(stdin);fclose(stdout);}
inline void readx(ll &x)
{
x=0;int s=1;char ch=getchar();
while(ch<'0'||ch>'9')
{if(ch=='-') s=-1;ch=getchar();}
while(ch>='0'&&ch<='9')
{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
x*=s;
}
inline ll qmul(ll x,ll y,ll mod)
{
x%=mod;y%=mod;
return ((x*y-(ll)(((long double)x*y+0.5)/mod)*mod)%mod+mod)%mod;
}
inline 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=y-a/b*x;
}
inline void china()
{
for(ll i=1;i<=n;++i) readx(a[i]);
for(ll i=1;i<=n;++i)
{
readx(m[i]);
a[i]=(a[i]%m[i]+m[i])%m[i];
M*=m[i];
}
for(ll i=1;i<=n;++i)
{
Mi=M/m[i];
ll x,y;
exgcd(Mi,m[i],x,y);
x=(x%m[i]+m[i])%m[i];
ans=((ans+qmul(qmul(a[i],x,M),Mi,M)%M)+M)%M;
}
ans=(ans+M)%M;
printf("%lld\n",ans);
}
int main()
{
// file();
readx(n);
china();
// closefile();
return 0;
}
原文地址:https://www.cnblogs.com/oierwyh/p/11376341.html
- 谈谈Nullable<T>的类型转换问题
- ASP.NET MVC是如何运行的(3): Controller的激活
- ASP.NET MVC是如何运行的[2]: URL路由
- 一个简单的小程序演示Unity的三种依赖注入方式
- 在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回
- 在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?
- ASP.NET MVC是如何运行的(4): Action的执行
- ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用
- 在Entity Framework中使用存储过程(五):如何通过存储过程维护多对多关系?
- ASP.NET MVC下基于异常处理的完整解决方案
- 不到40行代码构建正则表达式引擎
- 随便写一篇文章
- Java 10新特性解密
- Android组件化框架项目详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel 自定义常量的两种方案
- Thinkphp页面跳转设置跳转等待时间的操作
- Laravel 创建可以传递参数 Console服务的例子
- laravel实现查询最后执行的一条sql语句的方法
- 解决laravel groupBy 对查询结果进行分组出现的问题
- laravel批量生成假数据的方法
- 对laravel in 查询的使用方法详解
- PHP使用redis位图bitMap 实现签到功能
- thinkphp5+layui实现的分页样式示例
- Laravel实现搜索的时候分页并携带参数
- PHP7.3.10编译安装教程
- Laravel-添加后台模板AdminLte的实现方法
- PHP7 安装event扩展的实现方法
- 在laravel框架中使用model层的方法
- 漂亮的thinkphp 跳转页封装示例