2013金山西山居创意游戏程序挑战赛——初赛(4)

来源:互联网 发布:七天网络阅卷如何查分 编辑:程序博客网 时间:2024/05/20 19:18

第一题: HDU  4554    叛逆的小明

题目意思很明确,直接可以求解二元一次方程

a=(x+y)/2;

b=x-a;

然后用flag(+1、-1)记住每个的符号,使a、b都变为正数

然后求反,乘以flag然后做运算就ok了。

代码如下:

#include<iostream>#include<vector>#include<List>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>using namespace std;int i,j;const int N=20010;typedef long long LL;int fan(int k){//求反    int j,sum=0;    while(k)    {        j=k%10;        k/=10;        sum=sum*10+j;    }    return sum;}int main(){    int s,t,T,x,y;    cin>>T;    while(T--)    {        scanf("%d%d",&s,&t);        x=(s+t)/2;        y=s-x;        int f1=1,f2=1;        if(x<0)        {            x=-x;f1=-1;        }        if(y<0)        {            y=-y;f2=-1;        }        x=fan(x);        y=fan(y);        printf("%d %d\n",f1*x+f2*y,f1*x-f2*y);    }    return 0;}


第二题:

待续。。。。



第三题:  HUD   4556   Stern-Brocot Tree

两边是对称的,左边分母大于分子,右边分子大于分母。

且分子分母都是互质的,这让我们想到了 欧拉函数。

可以看出来,每个数都在上一级上面加了当前n的欧拉函数。。。

代码如下:

#include<iostream>#include<vector>#include<List>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>using namespace std;const int N=1000000;typedef __int64 LL;LL phi[N+10];//这个地方需要用long longvoid phi_table(){    memset(phi,0,sizeof(phi));    LL i,j;    phi[1]=1;    for(i=2;i<=N;i++)        if(!phi[i])            for(j=i;j<=N;j+=i)            {                if(!phi[j])                    phi[j]=j;                phi[j]=phi[j]/i*(i-1);            }}/*void phi_table(){    LL i,j;    for(i=1;i<=N;i++)        phi[i]=i;    for(i=2;i<=N;i++)        if(phi[i]==i)            for(j=i;j<=N;j+=i)                phi[j]-=phi[j]/i;}*/int main(){    phi_table();    for(int i=2;i<=N;i++)        phi[i]+=phi[i-1];    int n;    while(cin>>n)        printf("%I64d\n",phi[n]*2+1);//对称的,所以phi[i]*2+1    return 0;}



原创粉丝点击