题目描述

现有两组数字,每组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. 第七节:EF Core调用SQL语句和存储过程

    一. 查询类(FromSql) 1.说明 A. SQL查询必须返回实体的所有属性字段. B. 结果集中的列名必须与属性映射到的列名相匹配. C. SQL查询不能包含关联数据 D. 除Select以为的 ...

  2. Prometheus Alertmanager 介绍详解

    Prometheus 之 Alertmanager 介绍详解 告警无疑是监控中非常重要的环节,虽然监控数据可视化了,也非常容易观察到运行状态.但我们很难做到时刻盯着监控,所以程序来帮巡检并自动告警,这 ...

  3. 《 .NET并发编程实战》阅读指南 - 第12章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  4. 【问题记录】ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    一.问题描述 环境:MySQL 8.0 + Windows 由于密码错误或者其他原因导致无法连上MySQL服务,如下图: 二.解决方案 解决该问题的具体步骤如下: 1.关闭MySQL服务 以管理员权限 ...

  5. C# 中 ==和equals的区别

    不想说太多,直接上代码,这两个就没什么联系,有自己独立的规则.联系在一起其实不利于记忆. 下面是测试代码 Console.WriteLine("--equals和==的区别--") ...

  6. winfrom数据导出

    /// <summary> /// 数据导出 /// </summary> /// <param name="dataGridView">< ...

  7. tp5.0在控制器中和在模板中调用配置文件中的常量

    框架配置文件config.php中定义 'view_replace_str'  =>  [ '__MEMBER__'=> '/static/member',         '__uplo ...

  8. JavaScript中的类方法、对象方法、原型方法

    类方法:也叫函数方法,在JavaScript中函数也是一个对象,所以可以为函数添加属性以及方法: 对象方法:包括构造函数中的方法以及其原型上面的方法: 原型方法:一般用于对象实例共享,在原型上面添加该 ...

  9. Elasticasearch Web管理工具-Cerebro

    cerebro是一个使用Scala,Play Framework,AngularJS和Bootstrap构建的开源(MIT许可)elasticsearch web管理工具.需要Java 1.8或更高版 ...

  10. python-job