2011年12月10日
摘要: UVA_10820 看到题目说打表我就傻呵呵的把表打出来交了,结果超过了代码长度…… 后来看了别人的解题报告发现欧拉函数做就可以了,本来它就是解决n以内和n互质的数的个数的,数学的基础知识还是不牢固啊……#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 50010int N, phi[MAXD], A[MAXD];void prepare(){ int i, j, k; memset(phi, 0, sizeof(phi)); phi[1] = 1; N = 50000; for( 阅读全文
posted @ 2011-12-10 18:23 Staginner 阅读(476) 评论(0) 推荐(0) 编辑
摘要: UVA_10717 枚举桌腿的选择,然后求出最小公倍数之后再进行相应的计算、更新即可。#include<stdio.h>#include<string.h>#define MAXN 60#define MAXT 15int N, T, a[MAXN], t[MAXT];long long int low[MAXT], high[MAXT];long long int gcd(long long int x,long long int y){ return y == 0 ? x : gcd(y, x % y);}int init(){ int i; scanf(" 阅读全文
posted @ 2011-12-10 03:31 Staginner 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 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, 阅读全文
posted @ 2011-12-10 02:54 Staginner 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 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;... 阅读全文
posted @ 2011-12-10 02:19 Staginner 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 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 阅读全文
posted @ 2011-12-10 01:52 Staginner 阅读(256) 评论(0) 推荐(0) 编辑