金山西山居初赛第四场

来源:互联网 发布:手机恶意软件排行 编辑:程序博客网 时间:2024/04/30 12:34

http://acm.hdu.edu.cn/showproblem.php?pid=4554

hdu4554 叛逆的小明

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 77    Accepted Submission(s): 57


Problem Description
叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:
小明会把1234它看成4321;把-1234看成-4321;把230看成032 (032=32);把-230看成-032(-032=-32)。

现在,小明做了一些a+b和a-b的题目(a, b为整数且不含前导0),如果给你这些题目正确的答案,你能猜出小明会做得到什么答案吗?
 

Input
输入第一行为一个正整数T(T<=10000),表示小明共做了T道题。
接下来T行,每行是两个整数x,y(-1000000<=x, y<=1000000), x表示a+b的正确答案,y表示a-b的正确答案。
输入保证合法,且不需考虑a或b是小数的情况。
 

Output
输出共T行,每行输出两个整数s t,之间用一个空格分开,其中s表示小明将得到的a+b答案,t表示小明将得到的a-b答案。
 

Sample Input
320 67 7-100 -140
 

Sample Output
38 247 7-19 -23
 
#include<cstdio>int C(int x){    int y=0,t,p;    if(x>0)p=1;    else p=-1,x=-x;    while(x){        t=x%10,x/=10;        y=y*10+t;    }    return p*y;}int main(){    int x,y,a,b,T;    scanf("%d",&T);    while(T--){        scanf("%d%d",&x,&y);        a=(x+y)/2,b=(x-y)/2;        printf("%d %d\n",C(a)+C(b),C(a)-C(b));    }    return 0;}

http://acm.hdu.edu.cn/showproblem.php?pid=4555

hdu4554 平面上的整点

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 11    Accepted Submission(s): 1


Problem Description
  众所周知,在三维空间内,不共线的三个点可以确定一个平面,现在给出三个点的空间坐标[x1,y1,z1],[x2,y2,z2],[x3,y3,z3],请计算在这3个点确定的平面上坐标分量x, y, z分别在[lx, rx],[ly, ry],[lz,rz]内的整数点有多少个。
 

Input
多组测试数据,每组数据包括两行。
第一行是9个整数x1, y1, z1, x2, y2, z2, x3, y3, z3表示三个点的坐标。
第二行有6个整数lx, rx, ly, ry, lz, rz 表示x, y, z的范围。
所有输入数据范围为[-10000, 10000],且
lx<=rx
ly<=ry
lz<=rz
 

Output
  对每组测试数据输出一个整数,占一行,在指定定坐标范围内指定平面上有多少个整数点,若输入的三个点不能确定一个平面,直接输出"-1"。
 

Sample Input
0 0 0 0 1 0 0 0 1-2 2 -2 2 -2 21 1 1 2 2 2 1 1 1-1 1 -1 1 -1 1
 

Sample Output
25-1
Hint
第二组Sample表示给定的3个点有重合点~
 


不会,待。。。

 

http://acm.hdu.edu.cn/showproblem.php?pid=4556

hdu4556 Stern-Brocot Tree

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 153    Accepted Submission(s): 90


Problem Description
  

  
  上图是一棵Stern-Brocot树,其生成规则如下:
  从第1行到第n行,每行相邻两数a/b和c/d,产生中间数(a+c)/(b+d),置于下一行中。将一行的分数(包括0/1,1/0),进行约分简化,则每一行(包括0/1,1/0,1/1),不会出现两个相同的分数。若分子或者分母大于n,则去掉该分数,将剩下的分数,从小到大排序,得到数列F。
  现在请您编程计算第n行的数列F的个数。
 


 

Input
  输入包含多组测试用例,每组输入数据是一个正整数n(n<=1000000)。
 


 

Output
  对于每组的测试数据n,请输出第n行的数列F的个数。
 


 

Sample Input
1246
 


 

Sample Output
351325


分析:对于第n行,就是求分子、分母不超过n的真分数有多少个,对于一个分母x,分子小于x的真分数就是x的欧拉函数,故递推打表

#include<cstdio>const int N=1000001;int e[N];bool f[N];__int64 a[N],res=0; void euler(){    int i,j;    for(i=1;i<N;i++)e[i]=i;    for(i=2;i<N;i++)if(e[i]==i){        for(j=i;j<N;j+=i)e[j]=e[j]/i*(i-1);    }}int main(){    int i;    euler();    for(i=1;i<N;i++)res+=e[i],a[i]=res*2+1;    while(~scanf("%d",&i))printf("%I64d\n",a[i]);    return 0;}