2016ACM/ICPC亚洲区大连站-重现赛 4F组合(pro.D+pro.H+pro.I+pro.J)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lidengdengter/article/details/82936549

D A Simple Math Problem HDU - 5974 (数学)

已知:\left\{\begin{matrix} x+y=a \\ lcm(x,y)=b \end{matrix}\right. ( lcm(x,y) 代表x和y的最小公倍数),求x和y的值。

设x*y=k*b,k即为gcd(x,y),即\left\{\begin{matrix} x+y=a \\ x*y=k*b \end{matrix}\right.(1)==\left\{\begin{matrix} \frac{x}{k}+\frac{y}{k}=\frac{a}{k} \\ \frac{x}{k}*\frac{y}{k}=\frac{b}{k} \end{matrix}\right.

因为\frac{x}{k},\frac{y}{k}互质,则其和与积也互质,即k=gcd(a,b),则k已知,计算方程组(1)即可,详见代码。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

ll gcd(ll a,ll b){
	return b==0?a:gcd(b,a%b);
}

int main(){
	ll a,b;
	while(~scanf("%lld%lld",&a,&b)){
		ll k=gcd(a,b);
		b*=k;
		ll tmp=sqrt(a*a-4*b);
		ll x=(a+tmp)/2;
		ll y=(a-tmp)/2;
		if(x>y) swap(x,y);
		if(x*y!=b)
			printf("No Solution\n");
		else printf("%lld %lld\n",x,y);
	}
	return 0;
}

H To begin or not to begin HDU - 5978 (数学+概率+思维)

游戏有k个黑球,1个红球,拿到红球即胜利,计算先手是否有优势赢游戏。

先手拿到红球的概率P为:

k=1:  P=\frac{1}{2}    ans=0

k=2:  P=\frac{1}{3}+\frac{2}{3}*\frac{1}{2}=\frac{2}{3}    ans=1

k=3:  P=\frac{1}{4}+\frac{3}{4}*\frac{2}{3}*\frac{1}{2}=\frac{1}{2}   ans=0

k=4: P=\frac{1}{5}+\frac{4}{5}*\frac{3}{4}*(\frac{1}{3}+\frac{2}{3}*\frac{1}{2})=\frac{1}{5}+\frac{2}{5}=\frac{3}{5}  ans=1

k=5: P=\frac{1}{6}+\frac{5}{6}*\frac{4}{5}*(\frac{1}{4}+\frac{3}{4}*\frac{1}{2})=\frac{1}{6}+\frac{2}{6}=\frac{1}{2}  ans=0

……

可以发现当k为奇数时先手无优势,当k为偶数时有优势。

#include<cstdio>

int main(){
	int k;
	while(~scanf("%d",&k)){
		if(k&1) printf("0\n");
		else printf("1\n");
	}
	return 0;
}

I Convex HDU - 5979(数学)

给出多边形中每个三角形的顶角,求多边形面积,只要求出每个三角形面积求和即可。

注意sin()里的是弧度值,要先把角度转换为弧度

#include<cstdio>
#include<cmath>
#define PI 3.1415927

int main(){
	int n,r;
	while(~scanf("%d%d",&n,&r)){
		double tmp=0;
		while(n--){
			double deg;
			scanf("%lf",&deg);
			tmp+=0.5*r*r*sin(deg*PI/180);
		}
		printf("%.3lf\n",tmp);
	}
	return 0;
}

J Find Small A HDU - 5980(进制)

给n个数,每个数都可以拆开成一个32位的2进制

每8位一个字节 ,每个字节的2进制数换算成十进制时有多少个97,见代码

#include<cstdio>

int main(){
	int n;
	while(~scanf("%d",&n)){
		int ans=0;
		while(n--){
			int val;
			scanf("%d",&val);
			if(val==0) continue;
			while(val){
				if(val%(1<<8)==97) ans++;
				val/=(1<<8);
			}
		}
		printf("%d\n",ans);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/lidengdengter/article/details/82936549