摘要:
UVA_10791 通过最小公倍数的求法,我们可以看出最小公倍数取决于每个素因子在各个数中的最高次,因此如果要和最小,我们一定会把同一素因子放在同一整数中。 再者,由于a*b>a+b,因此我们应该将不同的素因子放在不同的整数中,这样,剩下的工作就是去分解素因子并求和了。 需要注意几点:①N为1的情况;②N为素数的情况;③N只有一种素因子的情况,如32;④N为2^31-1这个素数时的情况。#include<stdio.h>#include<string.h>#include<math.h>int N;void solve(){ int i, j, k, 阅读全文
摘要:
UVA_11121 将题目描述给的式子逆着推回去即可,同时要注意模运算有可能得到负数,但bi都是正的,这个时候+2再取次模即可。#include<stdio.h>#include<string.h>int a[50];void solve(){ int i, n; scanf("%d", &n); memset(a, 0, sizeof(a)); for(i = 0; i < 40; i ++) { a[i] = (n % 2 + 2) % 2; n = (n - a[i]) / (-2); } for(i = 40; i;... 阅读全文
摘要:
UVA_10673 这个题目可以用拓展欧几里得算法求一组整数解,但实际上也可以直接去构造。 我们知道向上取整和向下取整之差只能为0或1,如果为1,我们显然可以找到p=x,q=-x为符合要求的一组解,如果为0,那么只要(p+q)[x/k]=x,同时注意到在这种情况下x%k==0,所以令p+q=k即可,如果想让p、q有整数解,最简单的办法就是p=0,q=k。#include<stdio.h>#include<string.h>int main(){ int a, b, p, q, x, k, t; scanf("%d", &t); while(t 阅读全文