NOIP 2012 提高组 复赛 day2 mod 同余方程
2017-01-30 17:24
399 查看
NOIP 2012 提高组 复赛 day2 mod 同余方程
1.一看题目,还好数论里瞄过,没被数学符号给吓到,要不要将数论书再翻一翻,还是将该题AC了再说。
2.数学有储备,见了该题就不慌了。
3.看了该题,心里明白,一不小心就容易数据溢出,为了争取尽可能多的分,long long是免不了了。心里有个小九九,用C来写,写好后,正好去linux下用Arbiter进行测试,看看对%lld的支持。
4.简单做了运算int 最大值2*10^9 long long 最大值4*10^9*10^9,运算过程中随时注意取模,应该不会溢出。
5.编写代码,提交50分,剩下5个数据,全报TLE,超时了。
6.突然间想到一个办法,思路来自(10*2+1)/3=7,提交60分,剩下4个数据,全报TLE,超时了。
7.网络中搜索了一下,说是扩展欧几里德算法,好吧,开始学习。
8.翻书的过程中发现,关于信息学的书涉及的数学,比纯数学的书涉及的数学,讲解得更具体,更接近计算机的具体实现。故,翻书的顺序,先翻信息学的书,要扩充,完毕知识时,再翻纯数学的书。
9.学习一天未果,好吧,上代码学习,并进行相应跟踪。
10.稀里糊涂的编码,用的是扩展欧几里德算法,测试样例发现是-3,果断加上10,简单修改代码,提交AC。
11.还是要弄明白原理。再学习学习。
12.关于扩展欧几里德算法,这两篇文章介绍得不错,建议先阅读第一篇,之后第二篇。
http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html http://www.cnblogs.com/comeon4mydream/archive/2011/07/18/2109060.html
13.2011年时POJ1061青蛙的约会,比较流行,也即扩展欧几里德算法,2012年进行改编成为NOIP提高组复赛day2第一题。
附上AC代码,编译环境Dev-C++4.9.9.2
//2012 mod3
#include <stdio.h>
void gcd(int a,int b,int &d,int &x,int &y){
if(!b){
d=a;
x=1;
y=0;
}else{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main(){
int a,b,d,x,y;
scanf("%d%d",&a,&b);
gcd(a,b,d,x,y);
while(x<0){
x+=b;
}
printf("%d\n",x);
return 0;
}
附上60分代码,编译环境Dev-C++4.9.9.2
//2012 同余方程 mod2
#include <stdio.h>
int main(){
long long a,b,i,j;
scanf("%lld%lld",&a,&b);
i=1;
while(1){
if((b*i+1)%a==0)
break;
i++;
}
printf("%lld\n",(b*i+1)/a);
return 0;
}
附上50分代码,编译环境Dev-C++4.9.9.2
//2012 同余方程
#include <stdio.h>
int main(){
long long a,b,i,t,j;
scanf("%lld%lld",&a,&b);
i=1;
t=a;
t%=b;
while(1){
j=i;
j%=b;
if((t*j)%b==1)
break;
i++;
}
printf("%lld\n",i);
return 0;
}
附上poj1061青蛙的约会AC代码,编译环境Dev-C++4.9.9.2(很多小的细节)
//poj1061 青蛙的约会
#include <stdio.h>
void gcd(long long a,long long b,long long &d,long long &x, long long &y){
if(!b){
d=a;
x=1;
y=0;
}else{
gcd(b,a%b,d,y,x);
y-=a/b*x;
}
}
int main(){
long long a,b,d,x,y,b2;
long long t1,t2,t3,t4,t5;
scanf("%lld%lld%lld%lld%lld",&t1,&t2,&t3,&t4,&t5);
a=t3-t4;
b=t5*-1;
gcd(a,b,d,x,y);
if((t2-t1)%d!=0){
printf("Impossible\n");
}else{
b2=b/d;
x=((t2-t1)/d*x%b2+b2)%b2;
printf("%lld\n",x);
}
return 0;
}
1.一看题目,还好数论里瞄过,没被数学符号给吓到,要不要将数论书再翻一翻,还是将该题AC了再说。
2.数学有储备,见了该题就不慌了。
3.看了该题,心里明白,一不小心就容易数据溢出,为了争取尽可能多的分,long long是免不了了。心里有个小九九,用C来写,写好后,正好去linux下用Arbiter进行测试,看看对%lld的支持。
4.简单做了运算int 最大值2*10^9 long long 最大值4*10^9*10^9,运算过程中随时注意取模,应该不会溢出。
5.编写代码,提交50分,剩下5个数据,全报TLE,超时了。
6.突然间想到一个办法,思路来自(10*2+1)/3=7,提交60分,剩下4个数据,全报TLE,超时了。
7.网络中搜索了一下,说是扩展欧几里德算法,好吧,开始学习。
8.翻书的过程中发现,关于信息学的书涉及的数学,比纯数学的书涉及的数学,讲解得更具体,更接近计算机的具体实现。故,翻书的顺序,先翻信息学的书,要扩充,完毕知识时,再翻纯数学的书。
9.学习一天未果,好吧,上代码学习,并进行相应跟踪。
10.稀里糊涂的编码,用的是扩展欧几里德算法,测试样例发现是-3,果断加上10,简单修改代码,提交AC。
11.还是要弄明白原理。再学习学习。
12.关于扩展欧几里德算法,这两篇文章介绍得不错,建议先阅读第一篇,之后第二篇。
http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html http://www.cnblogs.com/comeon4mydream/archive/2011/07/18/2109060.html
13.2011年时POJ1061青蛙的约会,比较流行,也即扩展欧几里德算法,2012年进行改编成为NOIP提高组复赛day2第一题。
附上AC代码,编译环境Dev-C++4.9.9.2
//2012 mod3
#include <stdio.h>
void gcd(int a,int b,int &d,int &x,int &y){
if(!b){
d=a;
x=1;
y=0;
}else{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main(){
int a,b,d,x,y;
scanf("%d%d",&a,&b);
gcd(a,b,d,x,y);
while(x<0){
x+=b;
}
printf("%d\n",x);
return 0;
}
附上60分代码,编译环境Dev-C++4.9.9.2
//2012 同余方程 mod2
#include <stdio.h>
int main(){
long long a,b,i,j;
scanf("%lld%lld",&a,&b);
i=1;
while(1){
if((b*i+1)%a==0)
break;
i++;
}
printf("%lld\n",(b*i+1)/a);
return 0;
}
附上50分代码,编译环境Dev-C++4.9.9.2
//2012 同余方程
#include <stdio.h>
int main(){
long long a,b,i,t,j;
scanf("%lld%lld",&a,&b);
i=1;
t=a;
t%=b;
while(1){
j=i;
j%=b;
if((t*j)%b==1)
break;
i++;
}
printf("%lld\n",i);
return 0;
}
附上poj1061青蛙的约会AC代码,编译环境Dev-C++4.9.9.2(很多小的细节)
//poj1061 青蛙的约会
#include <stdio.h>
void gcd(long long a,long long b,long long &d,long long &x, long long &y){
if(!b){
d=a;
x=1;
y=0;
}else{
gcd(b,a%b,d,y,x);
y-=a/b*x;
}
}
int main(){
long long a,b,d,x,y,b2;
long long t1,t2,t3,t4,t5;
scanf("%lld%lld%lld%lld%lld",&t1,&t2,&t3,&t4,&t5);
a=t3-t4;
b=t5*-1;
gcd(a,b,d,x,y);
if((t2-t1)%d!=0){
printf("Impossible\n");
}else{
b2=b/d;
x=((t2-t1)/d*x%b2+b2)%b2;
printf("%lld\n",x);
}
return 0;
}
相关文章推荐
- NOIP2012复赛提高组day2(A:同余方程 B:借教室 C:疫情控制)
- 扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)
- 【NOIP】提高组2012 同余方程
- NOIP2012 提高组复赛解题报告
- NOIP2012提高组 同余方程
- [NOIP2012提高组] CODEVS 1200 同余方程(扩展欧几里德算法)
- NOIP2012 提高组 复赛 day1 game 国王游戏 再见
- [NOIP2012] 提高组 洛谷P1082 同余方程
- 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]
- NOIP2012 提高组 复赛 day1 game
- C++——拓展欧几里得模板——同余方程【NOIP2012提高组】
- 【NOIP2012提高组】同余方程 (扩展欧几里得算法)
- NOIP 2012 提高组 复赛 day1 drive 开车旅行
- NOIP提高组 2012 同余方程
- [NOIp2012提高组]同余方程
- NOIP2012 提高组 复赛 day1 vigenere vigenere密码
- noip2012 同余方程
- codevs1200 同余方程 (2012年NOIP全国联赛提高组)拓展欧几里得
- NOIP2012提高组 借教室
- 2012Noip提高组Day2 T3 疫情控制