题目描述

现有两组数字,每组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. git 用 diff 来检查改动

    用 diff 来检查改动 项目的开发是由无数个微小的改动组成的.了解项目开发过程的关键就是要搞清楚每一个改动.当然你可以使用 “git status” 命令或更简单的 “git log” 命令来打印出 ...

  2. 关于多个版本的jquery冲突的问题

    关于多个版本的jquery冲突的问题 先加载新的版本jquery 然后使用no confi代码,直接上代码看效果 <script src="https://libs.baidu.com ...

  3. 剑指offer 栈的压入和弹出

    题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  4. Extjs 树菜单的自动展开数据的请求

    今天在做extjs开发的时候,在树菜单上遇到了一个坑,也许是我刚接触extjs 不熟的缘故 问题描述:后台设置的树自动展开,但是在前端总是只显示一条数据,但是数据确实都请求到了. 经过几个小时不屑的努 ...

  5. json方式的面向对象、拖拽

    //json方式的面向对象 var obj= { a:, b:, c:function(){ alert( } } obj.c();//12 //命名空间 var miaov={}; miaov.co ...

  6. 英语chrysopal金绿宝石chrysopal单词

    chrysopal金绿宝石,也称金绿玉.化学成分为BeAl2O4.晶体属正交(斜方)晶系的氧化物矿物.它位列名贵宝石,具有四个变种:猫眼,变石,变石猫眼和金绿宝石晶体. 金绿宝石本身就是较稀少的矿物, ...

  7. 浅谈华为验厂对MES系统的要求

    众所周知,华为对供应商在管理.防错.品控.追溯等方面的要求都非常严格.在华为验厂时,对供应商的信息系统,尤其是MES系统的评估也是有非常具体的要求.那么我们今天就来谈谈华为验厂时,对MES系统有哪些具 ...

  8. webrtc (6) 在Webrtc中集成VideoToolbox

    来源:http://blog.csdn.net/wangruihit/article/details/46550853 VideoToolbox是iOS平台在iOS8之后开放的一个Framework, ...

  9. Cloud Alert 实现告警智能降噪,成功规避告警风暴

    # 前言 睿象云前段时间发表了一篇[< Zabbix 实现电话.邮件.微信告警通知的实践分享>](https://www.toutiao.com/i6734876723126469127/ ...

  10. 一文教你如何使用miniconda

    安装python 之前安装python包,导致了python里面的包不兼容,用管理工具卸载也下载不掉,重新安装也安装不上,没有办法只能卸掉python重装. 安装Anaconda Anaconda指的 ...