HDU 4627 The Unsolvable Problem 数学
2014-10-19 10:56
141 查看
题意:给出n.求出1-n中的两个数a,b,使a+b=n且lcm(a,b)最大。
思路:开始没有思路,直接打表观察,发现对于每个n,lcm(a,b)最大时,a,b是两个互质且最靠近中间的两个数。所以直接从中间暴力搞就行了。
当然,这道题也有正确的解法。就是利用数论的知识:首先要知道,相邻的两个整数是互质的。相邻的两个奇数也是互质的
1.如果n为奇数,因为最靠近中间的两个数乘积最大,且互质,一定是中间的两个。
2.如果n为偶数,如果n = 4k,那么n/2是偶数,则n/2+1和n/2-1为奇数,互质。如果n = 4k+2,则n/2为奇数,n/2+1,n/2-1为偶数,还要增减1.
代码如下:
思路:开始没有思路,直接打表观察,发现对于每个n,lcm(a,b)最大时,a,b是两个互质且最靠近中间的两个数。所以直接从中间暴力搞就行了。
当然,这道题也有正确的解法。就是利用数论的知识:首先要知道,相邻的两个整数是互质的。相邻的两个奇数也是互质的
1.如果n为奇数,因为最靠近中间的两个数乘积最大,且互质,一定是中间的两个。
2.如果n为偶数,如果n = 4k,那么n/2是偶数,则n/2+1和n/2-1为奇数,互质。如果n = 4k+2,则n/2为奇数,n/2+1,n/2-1为偶数,还要增减1.
代码如下:
#include <cstdio> #include <algorithm> using namespace std; int main(void) { int T; scanf("%d", &T); while(T--){ long long n; scanf("%I64d", &n); long long mid = n / 2; while(__gcd(mid,n - mid) != 1) mid--; printf("%I64d\n",mid * (n - mid)); } return 0; }
#include <cstdio> using namespace std; int main(void) { int T; scanf("%d",&T); while(T--){ long long n; scanf("%I64d", &n); if(n == 2){ printf("1\n"); continue; } long long mid = n / 2; if(n&1) printf("%I64d\n",(mid+1) * mid); else if(n % 4 == 0) printf("%I64d\n",(mid-1)*(mid+1)); else printf("%I64d\n",(mid-2)*(mid+2)); } return 0; }
相关文章推荐
- poj 1543 & HDU 1334 & ZOJ 1331 Perfect Cubes(数学 暴力大法好)
- HDU 1418 抱歉(数学题)
- hdu 5171 GTY's birthday gift(数学,矩阵快速幂)
- HDU 5396 Expression(组合数学+区间DP)
- hdu-5000 Clone(DP+数学)
- hdu1271-----整数对 数学题
- HDU 6069 数学题,区间素数筛
- poj 1286 poj 2409 hdu 1812 polya定理 组合数学
- hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925
- HDU 5003 Osu!(数学题)
- hdu 6048 逆序数+思维数学
- HDU - 4810 Wall Painting(组合数学)
- hdu 1110 Equipment Box(数学)
- hdu 4811 Ball(数学)
- HDU 1568 Fibonacci(数学 递推式)
- HDU - 5728 欧拉函数 + 数学推导 + 指数循环节
- hdu 1273 漫步森林 (数学题)
- hdu 5924 Mr. Frog’s Problem(2016CCPC东北地区大学生程序设计竞赛 C题,数学思维)
- hdu 4614(数学 + 乱搞)
- HDU 5894 hannnnah_j’s Biological Test(组合数学 逆元)