上一页 1 ··· 55 56 57 58 59 60 61 62 63 ··· 85 下一页
  2011年12月10日
摘要: 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 阅读(622) 评论(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 阅读(255) 评论(0) 推荐(0) 编辑
  2011年12月9日
摘要: SGU_103 与一般的最短路问题不同的是,我们要首先判断什么时候才可以走上某条路,因此我们需要计算从当前这刻起两个灯变成相同颜色的最近的那一时刻,当然也有可能两灯根本不会变成相同的颜色,总体的一个思想就是如果两灯的一个最小公周期内没有出现相同的颜色,那么后面也一定不会出现相同的颜色。 在计算等待时间的时候,可以依次枚举也可以一次性加到两灯有其一变化的最近的那一刻。在计算最短路的过程中,也可以适当用一些剪枝以减少计算量,比如如果d[u]+t[i]>=d[v],即就算现在立刻可以上路也不能更新d[v],那么自然就不用计算两个灯在什么候会变成相同颜色了,同时如果枚举过程中当前时刻已经超过了d 阅读全文
posted @ 2011-12-09 22:13 Staginner 阅读(393) 评论(0) 推荐(0) 编辑
摘要: UVA_106 继续积累数学知识,这个题目需要用到勾股数的产生公式a=m^2-n^2,b=2*m*n,c=m^2+n^2,枚举m和n就可以求出所有<=N的互质的勾股数,然后把他们的<=N的倍数都删去,剩下的数就是不属于任何一组<=N的勾股数的数字。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 1000010int N, f[MAXD];int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}void 阅读全文
posted @ 2011-12-09 21:30 Staginner 阅读(346) 评论(0) 推荐(0) 编辑
摘要: SGU_102 一开始直接用gcd暴力也能过,后来看了别人的解题报告发现可以用欧拉函数,以前用过一次但现在忘记了,于是又学了一遍。#include<stdio.h>#include<string.h>#include<math.h>int N;void solve(){ int i, j, k = (int)sqrt(N + 1), res = N; for(i = 2; i <= k; i ++) if(N % i == 0) { res = res / i * (i - 1); while(N % i =... 阅读全文
posted @ 2011-12-09 19:09 Staginner 阅读(175) 评论(0) 推荐(0) 编辑
摘要: SGU_101 这个可以把骨牌看成一条边,把数字看成点,这样最后实际上就是去求一条欧拉道路。 对于无向图欧拉道路要求:①图必须连通;②度数为奇数的点没有或者只有两个。 不符合上述要求自然就无解了,如果有解选一个度数为奇数的点(如果没有就任取一个点)用dfs遍历一遍图把欧拉道路打印出来即可。#include<stdio.h>#include<string.h>#define MAXD 10#define MAXM 210int N, e, first[MAXD], next[MAXM], v[MAXM], p[MAXD], dgr[MAXD], vis[MAXM];int 阅读全文
posted @ 2011-12-09 17:58 Staginner 阅读(327) 评论(0) 推荐(0) 编辑
摘要: UVA_128 模运算。#include<stdio.h>#include<string.h>#define MAXD 1200int a[5], g = 34943;char b[MAXD], *str = "0123456789ABCDEF";void solve(){ int i; long long int k, res; k = 0; for(i = 0; b[i]; i ++) k = (b[i] + k * 256) % g; res = (g - (k * 65536) % g) % g; for(i = 0; i < 4; i 阅读全文
posted @ 2011-12-09 13:43 Staginner 阅读(210) 评论(0) 推荐(0) 编辑
  2011年12月8日
摘要: UVA_10006 这个题目可以提前把素数筛除来,然后先判断是否为素数,再用快速幂取模逐个验证a^n mod n是否为a即可。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 65010#define MAXN 65000int N, prime[MAXD];int init(){ scanf("%d", &N); return N;}void prepare(){ int i, j, k = (int)sqrt(MAXN) + 1; memset(pr 阅读全文
posted @ 2011-12-08 23:47 Staginner 阅读(361) 评论(0) 推荐(0) 编辑
摘要: UVA_138 这个题目让我第一次过了一把打表的瘾,自从悠然告诉我真正的打表法该怎么用了以后,这是第一次实践。 当然后来又学了一种佩尔方程解法,根据已知我们可以化简得到一个二元一次方程(2n+1)^2-8*m^2=1,然后找到基本解2n+1=3和m=1,依据递推公式找到后面的10对m、n打印出来即可。//打表程序#include<stdio.h>#include<string.h>int main(){ freopen("UVA_138(1).cpp", "w", stdout); long long int i, j, min, 阅读全文
posted @ 2011-12-08 22:55 Staginner 阅读(474) 评论(0) 推荐(0) 编辑
上一页 1 ··· 55 56 57 58 59 60 61 62 63 ··· 85 下一页