数论
文章平均质量分 54
冰阔落
Stay hungry, Stay foolish, Stop when you are perfect.
展开
-
UVA 10061 How many zero's and how many digits ?
#include #include const int primes[150]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,21原创 2014-07-26 18:53:06 · 1613 阅读 · 0 评论 -
UVA - 128 Software CRC
题目大意:给出一个字符串,表示一个256进制的数(因为char类型表示的字符范围),现在要再这个256进制的数后面加两位数值,使得新的数可以被十进制数g = 34943整除,输出添加两位数的16进制。解题思路:在原先的数的基础上加两位,比如加的两位数为x, 原先的数为y,那么新组成的数就为(y * 256 * 256 + x),而这个数要被g整除。所以我的做法是将num(256进制数)原创 2015-03-18 00:02:05 · 1493 阅读 · 0 评论 -
UVA - 10673 Play with Floor and Ceil
题目大意:给出x 和k,求解p和q使得等式x = p[x / k] + q [ x / k], 两个[x / k]分别为向下取整和向上取整。解题思路:欧几里得算法求解二元一次方程的解。#include int main() { int T; scanf("%d", &T); while (T--) { long long x, k; scanf("%ll原创 2015-03-18 00:07:38 · 1707 阅读 · 0 评论 -
UVA - 11121 Base -2
题目大意:给出一个十进制的数,将这个数转换成-2进制的数。解题思路:进制转化是一种很简单的题型,可是对于负数的进制来说我就很陌生了,研究了蛮久的,这里分享一下。首先要了解如何将一个-2进制的数转换成十进制数,例如7对应的-2进制数即为11011;1 * (-2) ^ 4 + 1 * (-2) ^ 3 + 0 * (-2) ^ 2 + 1 * (-2) ^ 1 + 1 *原创 2015-03-18 00:09:27 · 1530 阅读 · 0 评论 -
UVA - 10820 Send a Table
题目大意:给出一个n,求从1~n中任意两个数互质的对数为多少,和算两对。解题思路:用nloglogn的算法构造欧拉函数,然后用一个sum数组储存下总值,因为和算两对,所以每个phi[i]要加两倍,特殊情况用初始化sum[1] = 1.#include int main() { int n, vis[50005] = {1, 1}; for (int i = 2; i原创 2015-03-18 00:20:43 · 1549 阅读 · 0 评论 -
UVA - 10791 Minimum Sum LCM
题目大意:给出一个n,将n分解成n = p1 ^ k1 * p2 ^ k2 * ... * pm ^ km,然后求解sum = ∑(1≤i≤m)pi ^ ki.解题思路:比较费解的是n本身就是素数,那么n应该分解成n^ 1 + 1 ^ 1,所以sum= n + 1,还有一种就是n = p ^ k,sum = p ^ k + 1.#include #include int原创 2015-03-18 00:12:40 · 1566 阅读 · 0 评论 -
UVA - 10056 What is the Probability ?
题目大意:有n个人玩丢骰子游戏,丢到某个点数为赢然后结束,从第1个人开始丢然后依次下去到n,重新从1开始,直到有人赢为止。 输入n个人,每个人丢到目标点数的概率p,第m个人。求第m个人赢的概率解题思路:我们直接求出第一个人第100轮赢的概率,然后推出第m个人赢的概率#include #include int main() { int T; scanf("%d",原创 2015-03-12 21:26:40 · 1613 阅读 · 0 评论 -
UVA - 10491 Cows and Cars
题目大意:给出a,b和c,表示有a + b 个门, a个后面是牛, b个后面是车, 然后你从中选一个门,之后有一个知情人帮你打开c个后面是牛的门(因为1≤c解题思路:问题可以分成两种情况:1)第一次选中牛的时候,a/(a + b), 然后打开c个后面是牛的门,总关门数为(a + b - c - 1),然后还有b个门后面是车,所以p1 = a * b / (a + b) / (a原创 2015-03-13 18:44:49 · 1482 阅读 · 0 评论 -
UVA - 10169 Urn-ball Probabilities!
题目大意:两个罐子,开始一个有一个红球,一个有一个红球一个白球,每次取一个球(放回),然后多放一个白球进去。给定n,求出取n次出现取得两个红球的概率。和取n次都是两个红球的概率的小数点后面的0有几位。解题思路:第一个问题:取n次出现取得两个红球的概率=1 - 取n次一次都没出现取得两个红球的概率第二个问题:每次都取到两红球概率不断叠乘上去 p[i] = p[i - 1] *原创 2015-03-13 22:05:50 · 1572 阅读 · 0 评论 -
UVA - 10023 Square root
题目大意:给出一个出,然后你求他的开方,这个数最大为10^1000。解题思路:用二分搜索找到他的开方import java.io.*;import java.math.*;import java.util.*;public class Main { public static void main(String []arg) { Scanner cin = ne原创 2015-03-17 20:46:32 · 1645 阅读 · 0 评论 -
UVA - 10006 Carmichael Numbers
题目大意:判断一个数是否为Carmichael数, (非素数, 并且满足a^n % n == a, a 的取值为2 ~ n - 1)。解题思路:Eratosthenes筛选法求出素数,然后对应n如果为非素数,就对每个a进行判断,中间用到快速幂。#include #include const int N = 65005;int prime[N] = {0}, M = sqrt(原创 2015-03-17 23:59:48 · 1448 阅读 · 0 评论 -
UVA - 10375 Choose and divide
题目大意:给出p,q,s和r, 计算C(p, q) / C(s, r), 公式题目已经给出。解题思路:以为C(p,q) = C(p,p - q), 所以要尽量选择计算量交少的,边乘边除。#include #define min(a,b) (a)<(b)?(a):(b)int main() { int p, q, r, s; while (scanf("%d%d%d%d",原创 2015-03-17 23:57:34 · 1504 阅读 · 0 评论 -
UVA 10110 Light, more light
#include #include int main() { long int n; while (scanf("%ld", &n), n) { if ( long(sqrt(n)) * long(sqrt(n)) == n) printf("yes\n"); else printf("no\n"); } return 0;}原创 2014-07-26 16:22:09 · 1588 阅读 · 0 评论 -
UVA - 557 Burger
题目大意:给定2n个人,有n个汉堡和n个 奶酪汉堡,Ben and Bill排在最后,然后抛硬币,正反面分别拿汉堡和奶酪汉堡,如果有一样拿完了就不需要在扔硬币了。求最后ben和bill拿到一样的概率解题思路:这题直接算的话比较麻烦,因为不知道从第几个开始停止抛硬币。反过来算他们俩得到不同面包的概率比较简单。这样硬币就会从头抛到尾。所有的情况就是C(n/2 - 1, n - 2),就是把原创 2015-03-15 21:21:32 · 1822 阅读 · 0 评论 -
UVA - 571 Jugs
题意:有A, B两个容量的罐子,A B互质,可以对其执行一系列倒水操作,最终使B中剩下的水位n思路:1. 前提条件:如果A B互质,则 r = x*A mod B,对于x∈[0, B-1] r≠0. 这个很容易用最小公倍数证明之。2. 有了前提条件,则证明 r1 = x1*A mod B, r2 = x2*A mod B,对于x1, x2∈[0, B-1],x1≠x2 有r1≠原创 2015-03-07 15:21:26 · 1570 阅读 · 0 评论 -
UVA - 10759 Dice Throwing
题目大意:给出n和x,计算在丢n个色子,出现的点数大于等于x的概率,要求分式最简。解题思路:num[i][j] 与num[i][j + 1]中间的增长个数与用i个色子丢出的点数为j的情况有关,然而求用i个色子丢出点数的情况则是非常好求的:num[i][j] = ∑(j + 1 ≤ k ≤ j + 6)num[i][k].然后就可以进一步的去求丢出i个色子丢出的点数小于x的情况。原创 2015-03-17 23:42:25 · 1483 阅读 · 0 评论 -
UVA - 10308 Roads in the North
题目大意:给出一个无环无向图,求任意两点间的最大距离。输入空行问该组测试输入结束。解题思路:输入比较恶心,因为这个WA了一次,这题可以用dfs去做,任意选一个节点作为根节点,然后遍历与它相连的所有点,维护最大值就可以了,因为任意两点可以看成是以父亲节点而相连的。#include #include #include #include using namespace std原创 2015-03-17 20:58:21 · 1468 阅读 · 0 评论 -
UVA - 11029 Leading and Trailing
题目大意:给出一个n和k求n^k的前三位数和后三位数。解题思路:后三为数可以用分治的方法(快速幂)去做,可是前三位数就比较麻烦了,看了别人的题解.n^k = 10 ^ (k * log10(n)),所以可以将多余的位数移到小数点后面然后舍弃掉,只保留前三位,pow(10, 2 + fmod(k * log10(n), 1)).#include#includeint pow原创 2015-03-17 20:44:46 · 1517 阅读 · 0 评论 -
UVA - 10717 Mint
题目大意:给出n和m,然后给出n种硬币的的厚度,现在在给出m个桌子的高度,要求对应每个桌子high,输出两个值,从n种硬币中选取4种,每一种硬币用若干个叠在一起,使得四个柱一样吧高h,先在要找出一个h小于等于high,一个h大于等于high,两个值都要尽量接近high。解题思路:枚举四种硬币,求出它们的最小公倍数。#include #include using namespac原创 2015-03-17 22:06:43 · 1487 阅读 · 0 评论 -
UVA - 138 Street Numbers
题目大意: 实际就是给你两个数m、n,使得m、n之间的数之和与1~m之间的数之和相等(不包括m)。即:1+2+...+m-1 == (m+1)+...+n; 因此我们可以套用求和公式,两边移项化简得:2*pow(m,2) = n*(n+1)。因此我们可以得到:n = sqrt(2*m*m)。枚举 m 的值,从而判断所得到的 n 值是否为整数,若为整数则说明两边的值实际相等。得到输出满足条件原创 2015-03-17 23:43:47 · 1554 阅读 · 0 评论 -
UVA - 10105 Polynomial Coefficients
题目大意:给出n和m,再该出m个数值n1 ~ nm, 保证n1 + ... + nm = n,现在有算式(a1 + a2 + ... + am) ^ n, 求展开项中a1^n1 + a2^n2 +...+ am^nm这项的系数。解题思路:(a + b)^n的系数为C(i, n), 那么对于算式(a1 + a2 + ... + am)^n可以理解成(X + am)^n,类似于递归的操作。原创 2015-03-17 23:52:26 · 1470 阅读 · 0 评论 -
UVA - 10994 Simple Addition
题目大意:给出l和r,求∑(l≤i≤r)F(i), F(i)函数题目中有。解题思路:1 ~ N 之间的数可以按照1~9划分(只会有这几种情况), 我们可以算出 1 ~ p - 1 间的和, 再算出 1 ~ q 间的和 , 然后用 1 ~ q 间的和减去 1 ~ p ~ 1 间的和得出的结果即为 p ~ q 间的和#include typedef long long L原创 2015-03-18 20:41:56 · 1496 阅读 · 0 评论