题目描述

现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示。其中第二组中的数字是两两互素的。求最小的非负整数n,满足对于任意的i,n - ai能被bi整除。

输入格式

输入数据的第一行是一个整数k,(1 ≤ k ≤ 10)。接下来有两行,第一行是:a1,a2,...,ak,第二行是b1,b2,...,bk

输出格式

输出所求的整数n。

输入输出样例

输入 #1

3
1 2 3
2 3 5

输出 #1

23

说明/提示

所有数据中,第一组数字的绝对值不超过10^9(可能为负数),第二组数字均为不超过6000的正整数,且第二组里所有数的乘积不超过10^18


这其实只是一道“中国剩余定理”的模板题而已,然鹅出题人真的是丧心病狂 用心良苦,偏要设置几个坑让我们跳,很不幸的,我就中招了。

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n;
int a[],b[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
int main()
{
int k;k=read();ll m=,ans=;
for(int i=;i<=k;i++)a[i]=read();
for(int i=;i<=k;i++)
{
b[i]=read();
m*=b[i];
}
for(int i=;i<=k;i++)
{
ll mi=m/b[i],d,x,y;
exgcd(mi,b[i],d,x,y);
ans=(ans+a[i]*mi*x)%m;
}
printf("%lld",(ans+m)%m);
return ;

嗯,

代码敲完后自我感觉良好,

直接Ctrl + c 、 Ctrl + v,

按下提交键。

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n;
int a[],b[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
int main()
{
int k;k=read();ll m=,ans=;
for(int i=;i<=k;i++)a[i]=read();
for(int i=;i<=k;i++)
{
b[i]=read();
m*=b[i];
}
for(int i=;i<=k;i++)
{
ll mi=m/b[i],d,x,y;
exgcd(mi,b[i],d,x,y);
ans=(ans+a[i]*mi*x)%m;
}
printf("%lld",(ans+m)%m);
return ;
}
 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n;
int a[],b[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
int main()
{
int k;k=read();ll m=,ans=;
for(int i=;i<=k;i++)a[i]=read();
for(int i=;i<=k;i++)
{
b[i]=read();
m*=b[i];
}
for(int i=;i<=k;i++)
{
ll mi=m/b[i],d,x,y;
exgcd(mi,b[i],d,x,y);
ans=(ans+a[i]*mi*x)%m;
}
printf("%lld",(ans+m)%m);
return ;

结果居然发现——

然后我赶快回去看了几眼代码,感觉没啥毛病,于是又看了下别人的题解——

喔,我手速加了个快速乘,扫了一遍代码,测了遍样例 样例并没软用,再次Ctrl + c 、 Ctrl + v,按下了提交键,这次肯定没问题的吶~

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n;
int a[],b[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
ll ff(ll a,ll b,ll m)
{
ll ans=;
while(b)
{
if(b&)ans=(ans+a)%m;
a=(a+a)%m;
b>>=;
}
return ans;
}
int main()
{
int k;k=read();ll m=,ans=;
for(int i=;i<=k;i++)a[i]=read();
for(int i=;i<=k;i++)
{
b[i]=read();
m*=b[i];
}
for(int i=;i<=k;i++)
{
ll mi=m/b[i],d,x,y;
exgcd(mi,b[i],d,x,y);
x=(x%b[i]+b[i])%b[i];
ans=(ans+ff(ff(mi,x,m),a[i],m))%m;
}
printf("%lld",(ans+m)%m);
return ;
}
 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n;
int a[],b[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
ll ff(ll a,ll b,ll m)
{
ll ans=;
while(b)
{
if(b&)ans=(ans+a)%m;
a=(a+a)%m;
b>>=;
}
return ans;
}
int main()
{
int k;k=read();ll m=,ans=;
for(int i=;i<=k;i++)a[i]=read();
for(int i=;i<=k;i++)
{
b[i]=read();
m*=b[i];
}
for(int i=;i<=k;i++)
{
ll mi=m/b[i],d,x,y;
exgcd(mi,b[i],d,x,y);
x=(x%b[i]+b[i])%b[i];
ans=(ans+ff(ff(mi,x,m),a[i],m))%m;
}
printf("%lld",(ans+m)%m);
return ;

然鹅打脸就是来的这么突然( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)

我特么第二个点TLE掉是怎么回事?!!

不是,第一遍提交都莫得问题的鸭!我都忍不住要口吐芬芳(`へ´)

火速赶到题解区翻到了之前没看完的题解——

╮(╯▽╰)╭这毒瘤题,真拿它没办法┑( ̄Д  ̄)┍

第三次提交,终于满屏全绿(要想生活过得去,做题就得来点绿~

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
int n;
int a[],b[];
int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=;
y=;
}
else
{
exgcd(b,a%b,d,x,y);
ll t=x;x=y;y=t-a/b*y;
}
}
ll ff(ll a,ll b,ll m)
{
ll ans=;
while(b)
{
if(b&)ans=(ans+a)%m;
a=(a+a)%m;
b>>=;
}
return ans;
}
int main()
{
int k;k=read();ll m=,ans=;
for(int i=;i<=k;i++)a[i]=read();
for(int i=;i<=k;i++)
{
b[i]=read();
m*=b[i];
}
for(int i=;i<=k;i++)
{
ll mi=m/b[i],d,x,y;
exgcd(mi,b[i],d,x,y);
x=(x%b[i]+b[i])%b[i];
ans=(ans+ff(ff(mi,x,m),(a[i]+m)%m,m))%m;
}
printf("%lld",(ans+m)%m);
return ;
}

//参考:lahlah 的博客

[TJOI2009]猜数字(洛谷 3868)的更多相关文章

  1. P3868 [TJOI2009]猜数字

    [TJOI2009]猜数字 中国剩余定理 求解i=1 to n : x≡a[i] (mod b[i])的同余方程组 设 t= ∏i=1 to n b[i] 我们先求出 i=1 to n : x≡1 ( ...

  2. 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)

    洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...

  3. 洛谷 P3868 [TJOI2009]猜数字

    题意简述 给定\(a[1],a[2],\cdots,a[n]\) 和 \(b[1],b[2],\cdots,b[n]\),其中\(b\)中元素两两互素. 求最小的非负整数\(n\),满足对于任意的\( ...

  4. USACO1.4 1.5 搜索剪枝与数字 洛谷OJ P1214 P1215 P1217 P1218

    USACO1.4 题解 Arithmetic Progressions 题意 让你求长为n的由小于2*m*m的双平方数组成的等差数列有几个 双平方数:形如 B=P*P+Q*Q,p,q>0的数 题 ...

  5. [TJOI2009]猜数字

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  6. CRT【p3868】[TJOI2009]猜数字

    Description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...

  7. [Luogu3868] [TJOI2009]猜数字

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  8. [TJOI2009] 猜数字 - 中国剩余定理

    现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意的i,n ...

  9. Luogu P3868 [TJOI2009]猜数字

    题目链接 \(Click\) \(Here\) 中国剩余定理的板子.小心取模. #include <bits/stdc++.h> using namespace std; const in ...

随机推荐

  1. CentOS7部署vsftpd服务

    1.查看是否已经安装了vsftpd vsftpd -version 2.安装vsftpd(CentOS7) yum install -y vsftpd 3.新建FTP目录 创建的FTP目录如下: /d ...

  2. Spring Boot 自定义 Shiro 过滤器,无法使用 @Autowired 解决方法

    在 Spring Boot 中集成 Shiro,并使用 JWT 进行接口认证. 为了统一对 Token 进行过滤,所以自定义了一个 JwtTokenFilter 过滤器. 期间遇到了以下几个问题,这里 ...

  3. vue-如何实现带参数跳转页面

    [前后端分离项目之vue框架经验总结] 文/朱季谦 在vue框架的前端页面上,若要实现页面之间的带参数跳转,可参考以下实现过程: 例如,点击截图中的“查看试卷”,可实现带参跳转到相应的试卷页面,该功能 ...

  4. Oracle的数据类型和表的操作

    学习笔记: Oracle数据类型 1.创建表 ---创建一个person表 create table person( pid ), pname ) ); 2.修改表结构 --添加一列 )); --修改 ...

  5. 史上最全的音视频SDK包分享给大家

    史上最全的音视频SDK包分享给大家 概述一下SDK功能: 项目 详情视频通信  支持多种分辨率的视频通信语音通信  提供语音通信,可支持高清宽带语音动态创建房间  可以根据需要,随时创建房间H5 支持 ...

  6. DISK2VHD 转win2008 无法启动

    windows 2008R2物理机,使用微软的DISK2VHD转换成虚拟盘,挂到虚拟机上,无法启动只有光标闪.找来window2008安装盘 选择“修复windows系统”, 调出cmd命令提示符Bo ...

  7. RabbitMQ高级面试题

    本文涉及:投递失败的消息怎么处理.如何实现延时队列.如何指定消息的优先级.消息的持久化是如何实现的.如何保证消息不丢失 投递失败的消息怎么处理 首先投递失败存在如下两个情况 当交换器无法根据自身的类型 ...

  8. Jenkins 任务定时

    在项目配置中选择 Build Triggers 下勾选 Build periodically,可以对项目进行定时构建设置.构建设置详细可通过右边的问号符号进行查看. 定时构建字段遵循 cron 的语法 ...

  9. Java 之 Vector 集合

    一.构造方法 Vector():构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零. Vector(int initialCapacity) :使用指定的初始容量和等于零的容量增量构造 ...

  10. “You don't have permission to access /phpmyadmin/ on this server.”

    <Directory "I:/1/wamp/apps/phpmyadmin3.4.10.1/"> Options Indexes FollowSymLinks Mult ...