[TJOI2009]猜数字(洛谷 3868)
题目描述
现有两组数字,每组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)的更多相关文章
- 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 ( ...
- 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)
洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...
- 洛谷 P3868 [TJOI2009]猜数字
题意简述 给定\(a[1],a[2],\cdots,a[n]\) 和 \(b[1],b[2],\cdots,b[n]\),其中\(b\)中元素两两互素. 求最小的非负整数\(n\),满足对于任意的\( ...
- 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的数 题 ...
- [TJOI2009]猜数字
题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...
- CRT【p3868】[TJOI2009]猜数字
Description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...
- [Luogu3868] [TJOI2009]猜数字
题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...
- [TJOI2009] 猜数字 - 中国剩余定理
现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意的i,n ...
- Luogu P3868 [TJOI2009]猜数字
题目链接 \(Click\) \(Here\) 中国剩余定理的板子.小心取模. #include <bits/stdc++.h> using namespace std; const in ...
随机推荐
- 【More Effective C++ 条款5】对定制的“类型转换函数”保持警觉
1)C++允许内置数据类型之间进行隐式转换,比如char转int,int转double,对于内置数据类型的转换有详细的规则,但不管怎么样,这些都是语言提供的,相对安全,而且我们无法更改 对于自定义类的 ...
- sentry之一:sentry安装
Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题.它主要专注于持续集成.提高效率并且提升用户体验.Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在 ...
- golang ----array and slice
Go Slices: usage and internals Introduction Go's slice type provides a convenient and efficient mean ...
- 【java】Java多线程总结之线程安全队列Queue【转载】
原文地址:https://www.cnblogs.com/java-jun-world2099/articles/10165949.html ============================= ...
- dotnet + LinQ 按照指定的字段 和 排序方式排序
/// <summary> /// 根据指定属性名称对序列进行排序 /// </summary> /// <typeparam name="TSource&qu ...
- 排序算法Java代码实现(五)—— 快速排序
本篇内容: 快速排序 快速排序 算法思想: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排 ...
- HttpClient到底该不该using?
HttpClient实例是否应该释放掉? 从源代码中可以的看到httpClient类最上层实现了IDisposable接口,看到该接口我们下意识就是要用using(自动释放)代码块包含起.或者自己手动 ...
- Form之action提交不刷新不跳转
<div class="file-box"> <form action="/File/fileUpLoad" id="form1&q ...
- 对NetBackup 问题进行故障排除的步骤
错误消息通常是指出哪里出现故障的手段.如果在界面上没有看到错误消息,但仍怀疑有问题,请检查报告和日志. NetBackup提供了各种报告和日志记录工具, 这些工具可提供错误消息,直接为您指出解决方案. ...
- istio部署-helm
参考 istio/istio istio/Kubernetes Customizable Install with Helm Istio安装参数介绍 1. Istio Chart 目录结构 PATH: ...