题目描述

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

输入格式

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

输出格式

输出所求的整数n。

输入输出样例

输入 #1

  1. 3
  2. 1 2 3
  3. 2 3 5

输出 #1

23

说明/提示

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


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

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=;
  5. int n;
  6. int a[],b[];
  7. int read()
  8. {
  9. int x=,f=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')
  12. {
  13. if(ch=='-') f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')
  17. {
  18. x=x*+ch-'';
  19. ch=getchar();
  20. }
  21. return x*f;
  22. }
  23. void write(int x)
  24. {
  25. if(x<)
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>) write(x/);
  31. putchar(x%+'');
  32. }
  33. void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
  34. {
  35. if(!b)
  36. {
  37. d=a;
  38. x=;
  39. y=;
  40. }
  41. else
  42. {
  43. exgcd(b,a%b,d,x,y);
  44. ll t=x;x=y;y=t-a/b*y;
  45. }
  46. }
  47. int main()
  48. {
  49. int k;k=read();ll m=,ans=;
  50. for(int i=;i<=k;i++)a[i]=read();
  51. for(int i=;i<=k;i++)
  52. {
  53. b[i]=read();
  54. m*=b[i];
  55. }
  56. for(int i=;i<=k;i++)
  57. {
  58. ll mi=m/b[i],d,x,y;
  59. exgcd(mi,b[i],d,x,y);
  60. ans=(ans+a[i]*mi*x)%m;
  61. }
  62. printf("%lld",(ans+m)%m);
  63. return ;

嗯,

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

直接Ctrl + c 、 Ctrl + v,

按下提交键。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=;
  5. int n;
  6. int a[],b[];
  7. int read()
  8. {
  9. int x=,f=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')
  12. {
  13. if(ch=='-') f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')
  17. {
  18. x=x*+ch-'';
  19. ch=getchar();
  20. }
  21. return x*f;
  22. }
  23. void write(int x)
  24. {
  25. if(x<)
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>) write(x/);
  31. putchar(x%+'');
  32. }
  33. void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
  34. {
  35. if(!b)
  36. {
  37. d=a;
  38. x=;
  39. y=;
  40. }
  41. else
  42. {
  43. exgcd(b,a%b,d,x,y);
  44. ll t=x;x=y;y=t-a/b*y;
  45. }
  46. }
  47. int main()
  48. {
  49. int k;k=read();ll m=,ans=;
  50. for(int i=;i<=k;i++)a[i]=read();
  51. for(int i=;i<=k;i++)
  52. {
  53. b[i]=read();
  54. m*=b[i];
  55. }
  56. for(int i=;i<=k;i++)
  57. {
  58. ll mi=m/b[i],d,x,y;
  59. exgcd(mi,b[i],d,x,y);
  60. ans=(ans+a[i]*mi*x)%m;
  61. }
  62. printf("%lld",(ans+m)%m);
  63. return ;
  64. }
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=;
  5. int n;
  6. int a[],b[];
  7. int read()
  8. {
  9. int x=,f=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')
  12. {
  13. if(ch=='-') f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')
  17. {
  18. x=x*+ch-'';
  19. ch=getchar();
  20. }
  21. return x*f;
  22. }
  23. void write(int x)
  24. {
  25. if(x<)
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>) write(x/);
  31. putchar(x%+'');
  32. }
  33. void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
  34. {
  35. if(!b)
  36. {
  37. d=a;
  38. x=;
  39. y=;
  40. }
  41. else
  42. {
  43. exgcd(b,a%b,d,x,y);
  44. ll t=x;x=y;y=t-a/b*y;
  45. }
  46. }
  47. int main()
  48. {
  49. int k;k=read();ll m=,ans=;
  50. for(int i=;i<=k;i++)a[i]=read();
  51. for(int i=;i<=k;i++)
  52. {
  53. b[i]=read();
  54. m*=b[i];
  55. }
  56. for(int i=;i<=k;i++)
  57. {
  58. ll mi=m/b[i],d,x,y;
  59. exgcd(mi,b[i],d,x,y);
  60. ans=(ans+a[i]*mi*x)%m;
  61. }
  62. printf("%lld",(ans+m)%m);
  63. return ;

结果居然发现——

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

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

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=;
  5. int n;
  6. int a[],b[];
  7. int read()
  8. {
  9. int x=,f=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')
  12. {
  13. if(ch=='-') f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')
  17. {
  18. x=x*+ch-'';
  19. ch=getchar();
  20. }
  21. return x*f;
  22. }
  23. void write(int x)
  24. {
  25. if(x<)
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>) write(x/);
  31. putchar(x%+'');
  32. }
  33. void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
  34. {
  35. if(!b)
  36. {
  37. d=a;
  38. x=;
  39. y=;
  40. }
  41. else
  42. {
  43. exgcd(b,a%b,d,x,y);
  44. ll t=x;x=y;y=t-a/b*y;
  45. }
  46. }
  47. ll ff(ll a,ll b,ll m)
  48. {
  49. ll ans=;
  50. while(b)
  51. {
  52. if(b&)ans=(ans+a)%m;
  53. a=(a+a)%m;
  54. b>>=;
  55. }
  56. return ans;
  57. }
  58. int main()
  59. {
  60. int k;k=read();ll m=,ans=;
  61. for(int i=;i<=k;i++)a[i]=read();
  62. for(int i=;i<=k;i++)
  63. {
  64. b[i]=read();
  65. m*=b[i];
  66. }
  67. for(int i=;i<=k;i++)
  68. {
  69. ll mi=m/b[i],d,x,y;
  70. exgcd(mi,b[i],d,x,y);
  71. x=(x%b[i]+b[i])%b[i];
  72. ans=(ans+ff(ff(mi,x,m),a[i],m))%m;
  73. }
  74. printf("%lld",(ans+m)%m);
  75. return ;
  76. }
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=;
  5. int n;
  6. int a[],b[];
  7. int read()
  8. {
  9. int x=,f=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')
  12. {
  13. if(ch=='-') f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')
  17. {
  18. x=x*+ch-'';
  19. ch=getchar();
  20. }
  21. return x*f;
  22. }
  23. void write(int x)
  24. {
  25. if(x<)
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>) write(x/);
  31. putchar(x%+'');
  32. }
  33. void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
  34. {
  35. if(!b)
  36. {
  37. d=a;
  38. x=;
  39. y=;
  40. }
  41. else
  42. {
  43. exgcd(b,a%b,d,x,y);
  44. ll t=x;x=y;y=t-a/b*y;
  45. }
  46. }
  47. ll ff(ll a,ll b,ll m)
  48. {
  49. ll ans=;
  50. while(b)
  51. {
  52. if(b&)ans=(ans+a)%m;
  53. a=(a+a)%m;
  54. b>>=;
  55. }
  56. return ans;
  57. }
  58. int main()
  59. {
  60. int k;k=read();ll m=,ans=;
  61. for(int i=;i<=k;i++)a[i]=read();
  62. for(int i=;i<=k;i++)
  63. {
  64. b[i]=read();
  65. m*=b[i];
  66. }
  67. for(int i=;i<=k;i++)
  68. {
  69. ll mi=m/b[i],d,x,y;
  70. exgcd(mi,b[i],d,x,y);
  71. x=(x%b[i]+b[i])%b[i];
  72. ans=(ans+ff(ff(mi,x,m),a[i],m))%m;
  73. }
  74. printf("%lld",(ans+m)%m);
  75. return ;

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

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

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

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

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

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

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=;
  5. int n;
  6. int a[],b[];
  7. int read()
  8. {
  9. int x=,f=;
  10. char ch=getchar();
  11. while(ch<''||ch>'')
  12. {
  13. if(ch=='-') f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')
  17. {
  18. x=x*+ch-'';
  19. ch=getchar();
  20. }
  21. return x*f;
  22. }
  23. void write(int x)
  24. {
  25. if(x<)
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>) write(x/);
  31. putchar(x%+'');
  32. }
  33. void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
  34. {
  35. if(!b)
  36. {
  37. d=a;
  38. x=;
  39. y=;
  40. }
  41. else
  42. {
  43. exgcd(b,a%b,d,x,y);
  44. ll t=x;x=y;y=t-a/b*y;
  45. }
  46. }
  47. ll ff(ll a,ll b,ll m)
  48. {
  49. ll ans=;
  50. while(b)
  51. {
  52. if(b&)ans=(ans+a)%m;
  53. a=(a+a)%m;
  54. b>>=;
  55. }
  56. return ans;
  57. }
  58. int main()
  59. {
  60. int k;k=read();ll m=,ans=;
  61. for(int i=;i<=k;i++)a[i]=read();
  62. for(int i=;i<=k;i++)
  63. {
  64. b[i]=read();
  65. m*=b[i];
  66. }
  67. for(int i=;i<=k;i++)
  68. {
  69. ll mi=m/b[i],d,x,y;
  70. exgcd(mi,b[i],d,x,y);
  71. x=(x%b[i]+b[i])%b[i];
  72. ans=(ans+ff(ff(mi,x,m),(a[i]+m)%m,m))%m;
  73. }
  74. printf("%lld",(ans+m)%m);
  75. return ;
  76. }

//参考: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. 【More Effective C++ 条款5】对定制的“类型转换函数”保持警觉

    1)C++允许内置数据类型之间进行隐式转换,比如char转int,int转double,对于内置数据类型的转换有详细的规则,但不管怎么样,这些都是语言提供的,相对安全,而且我们无法更改 对于自定义类的 ...

  2. sentry之一:sentry安装

    Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题.它主要专注于持续集成.提高效率并且提升用户体验.Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在 ...

  3. golang ----array and slice

    Go Slices: usage and internals Introduction Go's slice type provides a convenient and efficient mean ...

  4. 【java】Java多线程总结之线程安全队列Queue【转载】

    原文地址:https://www.cnblogs.com/java-jun-world2099/articles/10165949.html ============================= ...

  5. dotnet + LinQ 按照指定的字段 和 排序方式排序

    /// <summary> /// 根据指定属性名称对序列进行排序 /// </summary> /// <typeparam name="TSource&qu ...

  6. 排序算法Java代码实现(五)—— 快速排序

    本篇内容: 快速排序 快速排序 算法思想: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排 ...

  7. HttpClient到底该不该using?

    HttpClient实例是否应该释放掉? 从源代码中可以的看到httpClient类最上层实现了IDisposable接口,看到该接口我们下意识就是要用using(自动释放)代码块包含起.或者自己手动 ...

  8. Form之action提交不刷新不跳转

    <div class="file-box"> <form action="/File/fileUpLoad" id="form1&q ...

  9. 对NetBackup 问题进行故障排除的步骤

    错误消息通常是指出哪里出现故障的手段.如果在界面上没有看到错误消息,但仍怀疑有问题,请检查报告和日志. NetBackup提供了各种报告和日志记录工具, 这些工具可提供错误消息,直接为您指出解决方案. ...

  10. istio部署-helm

    参考 istio/istio istio/Kubernetes Customizable Install with Helm Istio安装参数介绍 1. Istio Chart 目录结构 PATH: ...