第一题: 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 long
void 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;
}