NOIP2009提高组复赛题解
NOIP2009普及组复赛试题解题报告

NOIP2009xx组复赛试题解题报告xx1、多项式输出本题只是一个基本知识点考核的一个题目,主要是看参赛选手的细心程度,无算法体现。
先定义一个系数的数组a[105]。
首先这一题解题的大的方向需要考虑两点,多项式系数a[i]大于零和小于零两种情况,因为系数为零时不输出该项,而大于零的要求输出含有“+”号,小于零的直接输出。
然后在分项进行处理:第一项要单独处理,在处理第一项时有3种情况如下:If (a[i]==1)Else if (a[i]==-1)Else if (a[i]!=0)接着对第二项到第n-1项进行处理这里在循环里面处理又有(a[i]>0 && a[i]!=1)(a[i]==1)(a[i]<0&& a[i]!=-1)(a[i]==-1)这四种情况分别讨论。
然后对a[n-1]项进行处理,同上面的循环里的处理方法只要注意幂指数为1的时候不需要输出就可以了,省略幂指数。
最后对常数项处理,分两种情况,a[n]>0和a[n]<0两种情况分别讨论最终即可解出本题。
参考程序如下:#include"stdio.h"main(){FILE *fin,*fout;int i,a[105],n;fin=fopen("poly.in","r");fout=fopen("poly.out","w");fscanf(fin,"%d",&n);for(i=0;i<=n;i++)fscanf(fin,"%d",&a[i]);if(a[0]==1)fprintf(fout,"x^%d",n);else if(a[0]==-1)fprintf(fout,"-x^%d",n);else if (a[0]!=0)fprintf(fout,"%dx^%d",a[0],n);for(i=1;i<n-1;i++){if(a[i]>0 && a[i]!=1) fprintf(fout,"+%dx^%d",a[i],n-i);if (a[i]==1)fprintf(fout,"+x^%d",n-i);if(a[i]<0 && a[i]!=-1)fprintf(fout,"%dx^%d",a[i],n-i);if (a[i]==-1)fprintf(fout,"-x^%d",n-i);}if(a[n-1]>0 && a[n-1]!=1)fprintf(fout,"+%dx",a[n-1]);if(a[n-1]==1)fprintf(fout,"+x");if(a[n-1]<0&&a[n-1]!=-1)fprintf(fout,"%dx",a[n-1]);if(a[n-1]==-1)fprintf(fout,"-x");if(a[n]>0)fprintf(fout,"+%d",a[n]);if(a[n]<0)fprintf(fout,"%d",a[n]);fclose(fin);fclose(fout);}2、分数线划定本题就是一个基本的简单排序题目,由于数据范围比较小,不需要用到快排或者其他排序,只要会一种基本的排序即可,比如用最熟悉的冒泡就可以完成该题的所有测试数据。
NOIP提高组复赛题解

样例 输入: 33 039 285 570 输出: 34 数据规模: 30%的数据满足:1<=m,n<=10 100%的数据满足:1<=m,n<=50
思路: 首先想到搜索,但是对于只考虑一条路线来说, 每一步有两种状态 一共要走m+n步,搜索整棵树的 时间复杂度为O(2^(m+n)),如果两条路线都考虑的 话,时间复杂度为O(4^(m+n)),即使是30%的数据, 即m+n=20,4^20≈10^12,这样的数据规模也还是太 大了。
4维动态规划 本题可以使用动态规划法解决。 设f[i,j,k,l]为第一条线走到(I,j),第二条线走到 (k,l)时的最优值(方便起见,两条线都看作从左上角 开始,右下角结束)。 动态转移方程: f[i-1,j,k-1,l] (i>1) f[i,j,k,l]=min f[i-1,j,k,l-1] (i>1) +s[i,j]+s[k,l] f[i,j-1,k-1,l] (j>1)且(k>i+1) f[I,j-1,k,j-1] (j>1) 同时,由于两条线不能交叉,有k>i。
输入格式: 输入文件matches.in共一行,有一个整数n(n<=24)。 * 输出格式: 输出文件matches.out共一行,表示能拼成的不同等 式的数目。
样例1 输入:
14 输出: 2 解释: 2个等式为0+1=1和1+0=1。
样例2 输入: 18 输出: 9 解释: 9个等式为: 0+4=4、0+11=11、1+10=11、2+2=4、 2+7=9、4+0=4、7+2=9、10+1=11、11+0=11
【NOIP2009提高组】潜伏者

【NOIP2009提高组】潜伏者
这是一道建立在字符串背景下的模拟题。
字符串只是载体,字符串可以换成数字或其他元素,掌握模拟思路才是解题的关键。
题目描述
输入格式
输出格式
样例数据
题目描述
解题思路
这道题目的题目描述很长,题目本身难度并不大,真正理解好了题意才是关键。
简单的说一下题意,第1行是密文,第2行是密文对应的明文,第3行是需要翻译的字符串。
规则是,每个字母只对应一个唯一的「密字」,不同的字母对应不同的「密字」,在第2行的名文中26个字母必须全部出现。
如果违反了任意一个规则那么输出'Failed'。
如果都满足了上述的规则,就按照对应的「密文-明文」翻译第3行的字符串。
判断是否符合规则就成为了关键。
小编的做法是创建两个桶分别用来记录明文相对应的密文,和这个密文是否被使用过。
再用一个字符数组记录相对应「密文-明文」的值。
C++代码。
NOIP2009提高组复赛题解

1、潜伏者program spy;varv: array['A'..'Z'] of boolean; p, q: array['A'..'Z'] of char; a, b: string;j: char;i: integer;procedure stop;beginwriteln('Failed');close(input);close(output);halt;end;beginassign(input, 'spy.in');reset(input);assign(output, 'spy.out'); rewrite(output);readln(a);readln(b);fillchar(v, sizeof(v), 0);for i := 1 to length(a) do beginv[a[i]] := true;p[a[i]] := b[i];q[b[i]] := a[i];end;for j := 'A' to 'Z' doif not v[j] then stop;for i := 1 to length(a) do beginif p[a[i]] <> b[i] then stop; if q[b[i]] <> a[i] then stop; end;readln(a);for i := 1 to length(a) do write(p[a[i]]);writeln;close(input);close(output);end.2、Hankson的趣味题思路1:根据最大公约数的定义,X必定为最大公约数的倍数,那么我们可以去枚举a1的倍数,然后去验证最大公约数和最小公倍数是否符合条件。
期待分数:50。
程序1:vara0,a1,b0,b1,i,j,n,k,x,tot:longint;function gcd(a,b:longint):longint;beginif b=0 then exit(a) else exit(gcd(b,a mod b));end;beginreadln(n);for k:=1 to n dobegintot:=0;readln(a0,a1,b0,b1);for i:=1 to (b1 div a1) dobeginx:=i*a1;if b1 mod x=0 thenif gcd(a0,x)=a1 thenif (b0*x) div (gcd(b0,x))=b1 then begin inc(tot); end;end;writeln(tot);end;end.思路2:根据最小公倍数和最大公约数分解质因数指数的特殊关系进行优化。
【精选资料】NOIP提高组复赛试题与简解转载

Day1铺地毯【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。
一共有n 张地毯,编号从1 到n。
现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。
注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
【输入】输入文件名为 carpet.in。
输入共 n+2 行。
第一行,一个整数 n,表示总共有n 张地毯。
接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。
第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。
【输出】输出文件名为 carpet.out。
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。
【输入输出样例 1】【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。
【输入输出样例 2】【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。
【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。
【一句话题意】给定n个按顺序覆盖的矩形,求某个点最上方的矩形编号。
【考察知识点】枚举【思路】好吧我承认看到图片的一瞬间想到过二维树状数组和二维线段树。
置答案ans=-1,按顺序枚举所有矩形,如果点在矩形内则更新ans。
注意题中给出的不是对角坐标,实际上是(a,b)与(a+g,b+k)。
NOIP2009题解

河南省分数线:185
第一题:潜伏者
• 解析: • 解决本题只需创建1个长度为26的 数组即可进行转换,于是想在本题 拿分就要在读懂题意的基础上判断 何时输出“Failed”。
• 转换具体代码: • Int a[26],b;ห้องสมุดไป่ตู้
• for (b=0;b<str2.length();b++) • if((a[str1[b]'A']!=1)&&(a[str1[b]'A']!= str2 [b]-'A')) break;
else a[str1[b]-'A']=str2[b]-'A';
(a用来记录密码,str1,str2分别 为读入的第一第二行)
• 输出“Failed”的注意事项: • 无26个不同加密字母时必须输出 • “每个字母只对应一个唯一的‘密 字’”
第二题:Hankson的趣味题 第二题:Hankson的趣味题
解析: 在我个人看来,本题要想得满分则不能 对a0或a1或b0或b1进行分解质因数(或许 我的分解质因数写的太麻烦)因为按一般 分解质因数的计算次数是4675*2000*12 (最少更改次数与判断次数【一次取模或 乘方运算相当于4次一般运算{‘+’,‘-’, ‘*’,‘/’}】)这样的话就超时了。
如果要用的话可以对b0或b1进行数域划分(类 属骗分,因为只有看了数据才敢这样弄)这样倒 是可以让分解质因数的次数为2000*12*1000 (1000为估计值)这样可以采取以下算法: 首先普及一个公式: 将a分解质因数为(上界为n,下界为i=1) Πpi^ci,b分解质因数为(上界为n,下界为i=1) Πpi^di,则a,b的最小公倍数为: [a,b]=(上界为n,下界为i=1)Πpi^max(ci,di) 同理:若max改为min则是求最大公约数。 所以先将a1/a0,b1/b0,b0分解质因数。
Noip2009 提高组 第一题 潜伏者
Noip2009 提高组第一题潜伏者(spy.pas/c/cpp)【问题描述】R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。
历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:1、 S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他字母)。
2、 S国对于每个字母规定了对应的“密字”。
加密的过程就是将原信息中的所有字母替换为其对应的“密字”。
3、每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”。
“密字”可以和原字母相同。
例如,若规定‘A’的密字为‘A’,‘B’的密字为‘C’(其他字母及密字略),则原信息“ABA”被加密为“ACA”。
现在,小C通过内线掌握了S国网络上发送的一条加密信息及其对应的原信息。
小C希望能通过这条信息,破译S国的军用密码。
小C的破译过程是这样的:扫描原信息,对于原信息中的字母x(代表任一大写字母),找到其在加密信息中的对应大写字母y,并认为在密码里y是x的密字。
如此进行下去直到停止于如下的某个状态:1、所有信息扫描完毕,‘A’—‘Z’所有26个字母在原信息中均出现过并获得了相应的“密字”。
2、所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。
3、扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S过密码的编码规则)。
例如某条信息“XYZ”被翻译为“ABA”就违反了“不同字母对应不同密字”的规则。
在小C忙得头昏脑胀之际,R国司令部又发来电报,要求他翻译另外一条从S国刚刚截取到的加密信息。
现在请你帮助小C:通过内线掌握的信息,尝试破译密码。
然后利用破译的密码,翻译电报中的加密信息。
【输入】输入文件名为spy.in,共3行,每行为一个长度在1到100之间的字符串。
第1行为小C掌握的一条加密信息。
第2行为第1行的加密信息所对应的原信息。
第3行为R国司令部要求小C翻译的加密信息。
Cabfzan_aNOIP2009提高组解题报告
、|!_一个人总要走陌生的路,看陌生的风景,听陌生的歌,然后在某个不经意的瞬间,你会发现,原本费尽心机想要忘记的事情真的就这么忘记了..[原创]NOIP2009提高组解题报告{继续供大牛BS}2009-11-21 10:46 P.M.第一题:水题,按照题目要求去枚举。
注意,同一个字母加密后的字母是一样的,加密后一样的字母原字母也是一样的。
vars1,s2,s3:string;a,b:array['A'..'Z']of char;i:longint;c:char;procedure main;beginreadln(s1);readln(s2);readln(s3);fillchar(a,sizeof(a),' ');fillchar(b,sizeof(b),' ');for i:=1 to length(s1) doif ((a[s1[i]]<>' ')and(a[s1[i]]<>s2[i]))or((b[s2[i]]<>' ')and(b[s2[i]]<>s1[i])) thenbeginwriteln('Failed');exit;endelsebegina[s1[i]]:=s2[i];b[s2[i]]:=s1[i];end;for c:='A' to 'Z' doif a[c]=' ' thenbeginwriteln('Failed');exit;end;for i:=1 to length(s3) dowrite(a[s3[i]]);writeln;end;beginassign(input,'spy.in');reset(input);assign(output,'spy.out');rewrite(output);main;close(input);close(output);end.第二题:数论题,分解质因数。
NOIP2009普及组复赛解题报告
NOIP2009普及组复赛解题报告NFLS QMD第一题多项式输出1、摘要时间复杂度:O(n)空间复杂度:O(n)2、题目大意输入一个n次多项式各项的系数,按要求输出多项式3、算法分析先将不为0的系数和对应的次数存入a数组和b数组,然后依次输出。
要注意以下几点:①系数绝对值为1的情况②指数为1或0的情况③首项加号不必输出4、参考程序program poly;varn,i,g,xx:integer;a,b:array[0..200]of integer;function x(n:integer):string; //处理项的x^n部分varst1:string;beginif n=0 then x:='';if n=1 then x:='x';if n>1 thenbeginstr(n,st1);x:='x^'+st1;end;end;procedure flag(t:integer); //处理每项的符号beginif t>0 then write('+')else write('-');end;beginassign(input,'poly.in');reset(input);assign(output,'poly.out');rewrite(output);readln(n);g:=0;for i:=n downto 0 do //保存系数非零的项beginread(xx);if xx<>0 thenbeging:=g+1;a[g]:=xx;b[g]:=i;end;end;for i:=1 to g dobeginif i=1 then //处理首项的情况beginif abs(a[1])>1 then write(a[1]);if a[1]=-1 then write('-');endelsebeginflag(a[i]);if(b[i]=0)or(abs(a[i])<>1)then write(abs(a[i])); end;write(x(b[i]));end;writeln;close(input);close(output);end.第二题分数线划定1、摘要核心算法思想:排序时间复杂度:O(Nlog2N)空间复杂度:O(N)2、题目大意给出n个分数和编号(编号互不相同),按分数从大到小取前[m*150%]个(可能有重分情况),输出实际数目,最低分数以及按顺序排列的分数、编号。
1999-2009NOIP提高组复赛试题汇编
NOIP 19981.火车从始发站(称为第1站)开出,在始发站上车的人数为a ,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a 人。
从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。
现给出的条件是:共有N 个车站,始发站上车的人数为a ,最后一站下车的人数是m (全部下车)。
试问x 站开出时车上的人数是多少?2.设有n 个正整数(n ≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213又如:n=4时,4个整数7,13,4,246联接成的最大整数为:74246133.著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。
例如:其含义为:L+L=L ,L+K=K ,L+V=V ,L+E=E K+L=K ,K+K=V ,K+V=E ,K+E=KL E+E=KV根据这些规则可推导出:L=0,K=1,V=2,E=3同时可以确定该表表示的是4进制加法NOIP 1999第一题拦截导弹某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
样例:INPUTOUTPUT389207155300299170158656(最多能拦截的导弹数)2(要拦截所有导弹最少要配备的系统数)输入:a ,n ,m 和x输出:从x 站开出时车上的人数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NOIP2009提高组复赛题解(1)2010-02-21 19:381. 潜伏者(spy.pas/c/cpp)【问题描述】R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。
历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:1、 S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他字母)。
2、 S国对于每个字母规定了对应的“密字”。
加密的过程就是将原信息中的所有字母替换为其对应的“密字”。
3、每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”。
“密字”可以和原字母相同。
例如,若规定…A‟的密字为…A‟,…B‟的密字为…C‟(其他字母及密字略),则原信息“ABA”被加密为“ACA”。
现在,小C通过内线掌握了S国网络上发送的一条加密信息及其对应的原信息。
小C 希望能通过这条信息,破译S国的军用密码。
小C的破译过程是这样的:扫描原信息,对于原信息中的字母x(代表任一大写字母),找到其在加密信息中的对应大写字母y,并认为在密码里y是x的密字。
如此进行下去直到停止于如下的某个状态:1、所有信息扫描完毕,‘A’—‘Z’所有26个字母在原信息中均出现过并获得了相应的“密字”。
2、所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。
3、扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S过密码的编码规则)。
例如某条信息“XYZ”被翻译为“ABA”就违反了“不同字母对应不同密字”的规则。
在小C忙得头昏脑胀之际,R国司令部又发来电报,要求他翻译另外一条从S国刚刚截取到的加密信息。
现在请你帮助小C:通过内线掌握的信息,尝试破译密码。
然后利用破译的密码,翻译电报中的加密信息。
【输入】输入文件名为spy.in,共3行,每行为一个长度在1到100之间的字符串。
第1行为小C掌握的一条加密信息。
第2行为第1行的加密信息所对应的原信息。
第3行为R国司令部要求小C翻译的加密信息。
输入数据保证所有字符串仅由大写字母…A‟—…Z‟构成,且第1行长度与第2行相等。
【输出】输出文件spy.out共1行。
若破译密码停止时出现2,3两种情况,请你输出“Failed”(不含引号,注意首字母大写,其它小写)。
否则请输出利用密码翻译电报中加密信息后得到的原信息。
【输入输出样例1】【输入输出样例1说明】原信息中的字母…A‟和…B‟对应相同的密字,输出“Failed”。
字母…Z‟在原信息中没有出现,输出“Failed”。
3】【输入输出样例判断一个原信息对应多个密字的情况。
如:原信息AA,密字AB;和原信息AB,密字AA,这两种情况是不同的,要分别判断。
附程序:program spy(input,output);vara,b:array['A'..'Z'] of char;st1,st2,st3:string;i,j,n:integer;ch:char;procedure work;beginwriteln('Failed');close(input);close(output);halt;end;beginassign(input,'spy.in');assign(output,'spy.out');reset(input);rewrite(output);readln(st1);readln(st2);readln(st3);n:=length(st1);for ch:='A' to 'Z' dobegina[ch]:='#';b[ch]:='#';end;for i:=1 to n doif ((a[st1[i]]='#') and (b[st2[i]]='#')) or (a[st1[i]]=st2[i]) thenbegina[st1[i]]:=st2[i];b[st2[i]]:='@';endelse work;for ch:='A' to 'Z' doif b[ch]='#' then work;for i:=1 to length(st3) dowrite(a[st3[i]]);writeln;close(input);close(output);end.NOIP2009提高组复赛题解(2)2010-02-21 19:572. Hankson的趣味题(son.pas/c/cpp)【问题描述】Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。
现在,刚刚放学回家的Hankson正在思考一个有趣的问题。
今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。
现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:1、x和a0的最大公约数是a1;2、x和b0的最小公倍数是b1。
Hankson的“逆问题”就是求出满足条件的正整数x。
但稍加思索之后,他发现这样的x 并不唯一,甚至可能不存在。
因此他转而开始考虑如何求解满足条件的x的个数。
请你帮助他编程求解这个问题。
【输入】输入文件名为son.in。
第一行为一个正整数n,表示有n组输入数据。
接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。
输入数据保证a0能被a1整除,b1能被b0整除。
【输出】输出文件son.out共n行。
每组输入数据的输出结果占一行,为一个整数。
对于每组数据:若不存在这样的x,请输出0;若存在这样的x,请输出满足条件的x的个数;【输出输出样例】【说明】第一组输入数据,x可以是9、18、36、72、144、288,共有6个。
第二组输入数据,x可以是48、1776,共有2个。
【数据范围】对于50%的数据,保证有1≤a0,b1,b0,b1≤10000且n≤100。
对于100%的数据,保证有1≤a0,b1,b0,b1≤2,000,000,000且n≤2000。
这是一道数论题,本人数论很弱,这道题虽然A了但也不是很清楚,就不说了吧,直接贴程序。
program son(input,output);Const p:array[1..5133] of longint=(......);{p是素数表,从2开始一共5133个素数,百度空间发表不了那么长的文章,在这就不打了} varn,i,a1,a0,b1,b0:longint;procedure work;vari,x1,x2,tt,aa,bb,ans,c:longint;begintt:=b1 div a1;aa:=a0 div a1;bb:=b1 div b0;if b1 mod a1<>0 then begin writeln(0);exit; end;ans:=1;i:=1;while (i<=5133) and (p[i]*p[i]<=tt) doif tt mod p[i]=0 thenbeginx1:=aa mod p[i];x2:=bb mod p[i];if (x1=0) and (x2=0) then begin writeln(0);exit; end;c:=0;while tt mod p[i]=0 dobegininc(c);tt:=tt div p[i];end;if (x1<>0) and (x2<>0) then ans:=ans*(c+1);endelseinc(i);if tt<>1 thenbeginx1:=aa mod tt;x2:=bb mod tt;if (x1=0) and (x2=0) then begin writeln(0);exit; end;if (x1<>0) and (x2<>0) then ans:=ans*2;end;writeln(ans);end;beginassign(input,'son.in');assign(output,'son.out');reset(input);rewrite(output);readln(n);for i:=1 to n dobeginreadln(a0,a1,b0,b1);work;end;close(input);close(output);end.NOIP2009提高组复赛题解(3)2010-02-21 20:223. 最优贸易(trade.pas/c/cpp)【问题描述】C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。
任意两个城市之间最多只有一条道路直接相连。
这m条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1条。
C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。
但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。
商人阿龙来到C国旅游。
当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚回一点旅费。
设C国n个城市的标号从1-n,阿龙决定从1号城市出发,并最终在n号城市结束自己的旅行。
在旅游的过程中,任何城市可以重复经过多次,但不要求经过所有n个城市。
阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市迈入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球。
用赚取的差价当作旅费。
由于阿龙主要是来C国旅游,他决定这个贸易只进行最多一次。
当然,在赚不到差价的情况下它就无需进行贸易。
假设C国有5个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为单向通行。
双向箭头表示这条道路为双向通行。
假设1~n号城市的水晶球价格分别为4,3,5,6,1。
阿龙可以选择如下一条线路:1->2->3->5,并在2号城市以3的价格买入水晶球,在3号城市以5的价格卖出水晶球,赚取的旅费数为2。
阿龙也可以选择如下一条线路:1->4->5->4->5,并在第1次到达5号城市时以1的价格买入水晶球,在第2次到达4号城市时以6的价格卖出水晶球,赚取的旅费数为5。
现在给出n个城市的水晶球价格,m条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。