上一页 1 ··· 20 21 22 23 24 25 26 27 28 ··· 85 下一页
  2012年5月7日
摘要: URAL_1055 将组合数展开后的每个数依次分解素因子,最后再统计一下有多少种素因子就可以了。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXN 50010int N, M, isprime[MAXD], prime[MAXD], P, h[MAXN];void prepare(){ int i, j; P = 0; memset(isprime, -1, sizeof(isprime)); for(i = 2; i <= 1000; i ++) if(isprime[i]) ... 阅读全文
posted @ 2012-05-07 15:07 Staginner 阅读(242) 评论(0) 推荐(0) 编辑
摘要: URAL_1053 找了几个例子算了一下,发下对于两个不等的长度,最后会变成的长度等于他们的最大公约数。 后来突然意识到,题目中给的操作就是不断地在使用辗转相除,所以最后得到的结果当然就是两个数的最大公约数了。#include<stdio.h>#include<string.h>#define MAXD 1010int N, a[MAXD];int gcd(int x, int y){ return y == 0 ? x : gcd(y, x % y);}void init(){ int i; for(i = 1; i <= N; i ++) scanf(&quo 阅读全文
posted @ 2012-05-07 14:11 Staginner 阅读(168) 评论(0) 推荐(0) 编辑
摘要: URAL_1052 显然子弹的线路至少会通过两个点,于是我们枚举任意两个点就相当于枚举了所有可能的子弹的线路,这样每次再用叉积算一下有多少个点在直线上即可。#include<stdio.h>#include<string.h>#define MAXD 210int N, x[MAXD], y[MAXD];int det(int x1, int y1, int x2, int y2){ return x1 * y2 - x2 * y1;}void init(){ int i; for(i = 0; i < N; i ++) scanf("%d%d" 阅读全文
posted @ 2012-05-07 13:49 Staginner 阅读(267) 评论(0) 推荐(0) 编辑
摘要: URAL_1051 这个题目基本算是YY出来的,具体也没有去证明。 由于N和M可能比较大,于是就想如何将其变成小一点矩阵去考虑,这时发现3*x(x>=2)的矩阵有一个特性,可以变成3*(x-1)的矩阵,利用这个特性,我们可以将N*M(N,M>=3)的矩阵变成3*3、3*4、3*5、4*4、4*5、5*5之中的一个(因为可以通过一定的手段让x*y的矩阵变成(x-3)*y的矩阵,有个前提就是y>=3,至于怎么搞还是留给大家做思考吧,就不多说了),这样只要考虑有限个矩阵的情况就可以得到最后的结果了(不过我没有证明变成这样会不会使结果更差)。 画一下就可以得到3*3、3*4、3*5最 阅读全文
posted @ 2012-05-07 13:34 Staginner 阅读(279) 评论(0) 推荐(0) 编辑
摘要: URAL_1049 把各个数分解素因子之后应用乘法原理计算约数的个数即可。#include<stdio.h>#include<string.h>#define MAXD 10010int isprime[MAXD], prime[MAXD], P, h[MAXD];void prepare(){ int i, j, k; P = 0; memset(isprime, -1, sizeof(isprime)); for(i = 2; i <= 10000; i ++) if(isprime[i]) { prime[P ++... 阅读全文
posted @ 2012-05-07 12:18 Staginner 阅读(159) 评论(0) 推荐(0) 编辑
摘要: URAL_1047 根据原式可以得a[n+1]-a[n]=a[n]-a[n-1]+2*c[n]①,设S[n]=c[1]+c[2]+…+c[n],对①式叠加相消可以得到a[n+1]-a[1]=a[n]-a[0]+2*S[n],整理一下得到a[n+1]-a[n]=a[1]-a[0]+2*S[n]②,对②式叠加相消可以得到a[n+1]-a[1]=n*(a[1]-a[0])+2*(S[1]+S[2]+…+S[n]),这样就可以求得a[1]了。#include<stdio.h>#include<string.h>int N;void solve(){ int i; double 阅读全文
posted @ 2012-05-07 12:00 Staginner 阅读(169) 评论(0) 推荐(0) 编辑
摘要: URAL_1048 高精度加法。#include<stdio.h>#include<string.h>#define MAXD 1000010int a[MAXD], N;void solve(){ int i, x, y, s, c; for(i = 0; i < N; i ++) { scanf("%d%d", &x, &y); a[i] = x + y; } c = 0; for(i = N - 1; i >= 0; i --) { s = c + a[i]; c = s / 10; ... 阅读全文
posted @ 2012-05-07 11:48 Staginner 阅读(171) 评论(0) 推荐(0) 编辑
  2012年5月6日
摘要: 由于这个是一个有向图上的游戏,而且符合公平组合游戏的基本特征,所以可以直接求解各个节点的SG函数值。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXM 2010int N, K, first[MAXD], next[MAXM], e, v[MAXM], sg[MAXD], h[MAXD][MAXD];void add(int x, int y){ v[e] = y; next[e] = first[x], first[x] = e ++; }void dfs(int cur, int fa){ 阅读全文
posted @ 2012-05-06 16:49 Staginner 阅读(255) 评论(0) 推荐(0) 编辑
  2012年5月4日
摘要: 和URAL_1036是基本是一样的,具体的思路可以参考我的URAL_1036的解题报告:http://www.cnblogs.com/staginner/archive/2012/05/03/2481332.html。#include<stdio.h>#include<string.h>#define MAXD 10#define MAXS 50const int N = 4, S = 40;int f[MAXD][MAXS], ans[MAXD];void prepare(){ int i, j, k, sum; memset(f, 0, sizeof(f)); f[ 阅读全文
posted @ 2012-05-04 17:14 Staginner 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 原来URAL中tricky problem都是这么得微妙…… 直接将原图遍历,然后按遍历的时间将边标号即可,对于任意一个点,如果有至少两条边和其相连,那么至少有两条边的访问顺序是连续的,那么由于相邻的两个数的最大公约数是1,于是这样遍历一定能够得到解。#include<stdio.h>#include<string.h>#define MAXD 60#define MAXM 2510int N, M, e, first[MAXD], next[MAXM], v[MAXM], flag[MAXM], cnt;void add(int x, int y){ v[e] = y 阅读全文
posted @ 2012-05-04 14:34 Staginner 阅读(273) 评论(0) 推荐(0) 编辑
上一页 1 ··· 20 21 22 23 24 25 26 27 28 ··· 85 下一页