zoukankan      html  css  js  c++  java
  • [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


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

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int N=10000005;
     5 int n;
     6 int a[11],b[11];
     7 int read()
     8 {
     9     int x=0,f=1;
    10     char ch=getchar();
    11     while(ch<'0'||ch>'9')
    12     {
    13         if(ch=='-') f=-1;
    14         ch=getchar();
    15     }
    16     while(ch>='0'&&ch<='9')
    17     {
    18         x=x*10+ch-'0';
    19         ch=getchar();
    20     }
    21     return x*f;
    22 }
    23 void write(int x)
    24 {
    25     if(x<0)
    26     {
    27         putchar('-');
    28         x=-x;
    29     }
    30     if(x>9) write(x/10);
    31     putchar(x%10+'0');
    32 }
    33 void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
    34 {
    35     if(!b)
    36     {
    37         d=a;
    38         x=1;
    39         y=0;
    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=1,ans=0;
    50     for(int i=1;i<=k;i++)a[i]=read();
    51     for(int i=1;i<=k;i++)
    52     {
    53         b[i]=read();
    54         m*=b[i];
    55     }
    56     for(int i=1;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 0;
    64

     嗯,

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

    直接Ctrl + c 、 Ctrl + v,

    按下提交键。

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int N=10000005;
     5 int n;
     6 int a[11],b[11];
     7 int read()
     8 {
     9     int x=0,f=1;
    10     char ch=getchar();
    11     while(ch<'0'||ch>'9')
    12     {
    13         if(ch=='-') f=-1;
    14         ch=getchar();
    15     }
    16     while(ch>='0'&&ch<='9')
    17     {
    18         x=x*10+ch-'0';
    19         ch=getchar();
    20     }
    21     return x*f;
    22 }
    23 void write(int x)
    24 {
    25     if(x<0)
    26     {
    27         putchar('-');
    28         x=-x;
    29     }
    30     if(x>9) write(x/10);
    31     putchar(x%10+'0');
    32 }
    33 void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
    34 {
    35     if(!b)
    36     {
    37         d=a;
    38         x=1;
    39         y=0;
    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=1,ans=0;
    50     for(int i=1;i<=k;i++)a[i]=read();
    51     for(int i=1;i<=k;i++)
    52     {
    53         b[i]=read();
    54         m*=b[i];
    55     }
    56     for(int i=1;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 0;
    64 }

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int N=10000005;
     5 int n;
     6 int a[11],b[11];
     7 int read()
     8 {
     9     int x=0,f=1;
    10     char ch=getchar();
    11     while(ch<'0'||ch>'9')
    12     {
    13         if(ch=='-') f=-1;
    14         ch=getchar();
    15     }
    16     while(ch>='0'&&ch<='9')
    17     {
    18         x=x*10+ch-'0';
    19         ch=getchar();
    20     }
    21     return x*f;
    22 }
    23 void write(int x)
    24 {
    25     if(x<0)
    26     {
    27         putchar('-');
    28         x=-x;
    29     }
    30     if(x>9) write(x/10);
    31     putchar(x%10+'0');
    32 }
    33 void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
    34 {
    35     if(!b)
    36     {
    37         d=a;
    38         x=1;
    39         y=0;
    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=1,ans=0;
    50     for(int i=1;i<=k;i++)a[i]=read();
    51     for(int i=1;i<=k;i++)
    52     {
    53         b[i]=read();
    54         m*=b[i];
    55     }
    56     for(int i=1;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 0;
    64

     

    结果居然发现——

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

     

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

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

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

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

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

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

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

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

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

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

     //参考:lahlah 的博客

  • 相关阅读:
    集合 Subset Sums
    resin config 中文(resin.xml)
    resin4 简单学习
    什么是敏捷软件测试
    10个热门IT证书
    LoadRunner监控Linux服务器
    Agile 敏捷开发
    戴明PDCA方法
    【转】什么是内存泄露? 内存泄露检测工具
    LoadRunner常见问题
  • 原文地址:https://www.cnblogs.com/ljy-endl/p/11409941.html
Copyright © 2011-2022 走看看