[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
 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
 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
 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

 [TJOI2009]猜数字(洛谷 3868)_第1张图片

结果居然发现——

[TJOI2009]猜数字(洛谷 3868)_第2张图片

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

 [TJOI2009]猜数字(洛谷 3868)_第3张图片

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

 1 #include
 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
 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;

 

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

[TJOI2009]猜数字(洛谷 3868)_第4张图片

[TJOI2009]猜数字(洛谷 3868)_第5张图片

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

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

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

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

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

[TJOI2009]猜数字(洛谷 3868)_第6张图片

 1 #include
 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 的博客

 

 

转载于:https://www.cnblogs.com/ljy-endl/p/11409941.html

你可能感兴趣的:(数据结构与算法)