摘要:
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]) ... 阅读全文
摘要:
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 阅读全文
摘要:
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" 阅读全文
摘要:
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最 阅读全文
摘要:
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 ++... 阅读全文
摘要:
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 阅读全文
摘要:
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; ... 阅读全文