
ACM-数论
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
uva 128
题意:给出一个字符串,把每一个字符对应ascii码的值,每个字符就是一个256进制的数,将这个字符串末尾再添加两个数要刚好整除n = 34943,要求输出这两个数的16进制形式。题解:先利用 (a+b)mod n =( ( a mod n ) + (b mod n) ) mod n 和 (a * b) mod n =( ( a mod n ) * (b mod n) ) mod n 可以原创 2014-11-25 21:22:02 · 626 阅读 · 0 评论 -
uva 10491(数论)
题意:有一些门,a个门内是牛,b个门内是车,一开始可以选择一个门,然后在门打开之前,一个人会打开剩下其中c个有牛的门,然后你可以选择继续打开已选择的门或者打开其他没有被打开的门,问得到的是车的概率是多少。题解:两种情况,如果一开始选择的是牛,p1 = a / (a + b),然后选择的是车的概率是 p1 *= b / (a + b - c - 1),另一种是先选择的是车p2 = b / (a原创 2015-01-31 16:46:09 · 629 阅读 · 0 评论 -
uva 10759(数论)
题意:有n个骰子,给出一个目标值x,求出得到的所有骰子点数之和大于x的概率。题解:分母肯定是6^n,分子需要dp得到,开一个二维数组f[i][j]表示i个骰子组成和大于等于j的情况有多少种。状态转移方程是f[i][j + k] += f[i - 1][j],然后两个值求最大公约数约分一下就可以了。#include #include #include #define ll long原创 2015-01-31 22:40:51 · 604 阅读 · 0 评论 -
uva 10673
题意:给出x和k,满足,输出p和q。#include int main() { int t; long long x, k; scanf("%d", &t); while (t--) { scanf("%lld%lld", &x, &k); if (x % k) printf("%lld %lld\n", -x, x); else printf("0 %原创 2014-12-27 13:18:09 · 614 阅读 · 0 评论 -
uva 11121
题意:给出一个十进制的数字,输出他的-2进制数。题解:-2进制与2进制的区别是在奇数位会减去这个数字而不是像2进制一样加上这个数,所以需要将当前余数和后面一位的余数更改来填补前一位的增加或减少。#include #include const int N = 100;int n, res[N];int main() { int t, cas = 1; scanf("%d",原创 2014-12-28 13:35:51 · 555 阅读 · 0 评论 -
uva 10791
题意:一个序列的数的LCM值是n,要求输出这个序列的最小和。LCM是指这串序列的最小公倍数。题解:从小到大找到n所有的因子,因子从2开始到sqrt(n),因为n的因子如果有比sqrt(n)大也只会存在一个,然后分三种情况,已经写在注释中。#include #include #include int main() { long long n, res; int cas = 1原创 2014-12-28 18:29:54 · 585 阅读 · 0 评论 -
uva 10277
题意:有一些袜子,红色和黑色都有,一个人任意那两双都是红色的概率是p/q,问这些袜子中红色和黑色至少各多少只。题解:设红色r只,总共n只,那么p * k= r * (r - 1),q * k = n * (n - 1),可以从小到大枚举出一个符合条件的n,然后得到r,黑色数量就是n - r。不要忘记p = 0特殊情况。#include #include long long p,原创 2015-02-07 22:41:52 · 588 阅读 · 0 评论 -
uva 10169
题意:有两个缸子,最开始一个缸子里只有一个红球,另一个缸子有一个红球一个白球,然后从缸子里各取一个球出来,计算都是红球的概率,然后把球放回去,再在缸子里各放一个白球,再各取一个球出来,循环下去,问n次取球中至少有一次是两个都是红球的概率,和每次都是两个红球的时的概率小数点后有多少个连续的0。题解:两个都是红球的概率是p = (1 / i) * (1 / (i + 1)) = 1 / (i原创 2015-02-07 23:07:38 · 523 阅读 · 0 评论 -
lightOJ 1030(期望)
题意:有一个迷宫是1×n的格子,一个人每到一个格子就可以把这个格子内的金子全部拿走,刚开始站在第1个格子,然后开始掷骰子得到点数x,他就要从当前位置走到加x的位置,如果发现位置是大于n的就重新掷骰子直到符合,如果他到了第n个格子就可以结束了。问这个人从迷宫里得到的金子的期望是多少。 题解:可以知道对于每个位置,下一个位置只能是后6个,所以从这个位置处得到的金子的期望f(i) = (f(i + 1)原创 2015-06-04 22:28:06 · 1265 阅读 · 0 评论 -
ligntOj 1038(期望)
题意:给出一个n,一步操作是让n除n的一个随机因子得到新的n,问可以得到新的n是1的步数期望。 题解:因为n/1=n这种选择会造成循环,所以需要用到递推,令n变成1的步数期望是f[n],比如n是2,f[2] = 1/2(f[2] + 1) + 1/2(f[1] + 1),加1是因为2变成2也需要一步,那么移项后,f[2] = 2 + f[1] = 2 + 0 = 2。 从小到大打一个f的表。#i原创 2015-06-10 21:42:05 · 615 阅读 · 0 评论 -
lightOj 1027(期望)
题意:一个人在迷宫内,面前有n扇门,每个门都对应一个时间,如果时间是正数a,表示通过这扇门a分钟后可以离开迷宫,如果时间是负数a,表示通过这扇门abs(a)分钟后会重新回到这里,一个人任意选择n扇门,且如果回到这里会忘记之前选过的门,问离开迷宫的期望时间。 题解:可以令x是离开迷宫的期望时间,那么对应第三组样例,x = 1/3 * 3 + 1/3 * (x + 6) + 1/3 * (x + 9)原创 2015-06-11 17:47:08 · 719 阅读 · 0 评论 -
lightOj 1079(期望)
题意:有一个人要抢银行,有n家银行,第i个银行有m[i]的财富,且抢第i个银行被抓的概率是p[i],如果这个人抢银行被抓的概率不超过P,就是安全的,问保证安全的情况下能抢到的最大财富值是多少,每个银行只能被抢一次。 题解:01背包问题,银行i和j都抢的逃跑概率是(1-p[i]) * (1-p[j]),所以用01背包模板计算抢到价值k的逃跑概率是f[k],然后逆着从最大价值sum的f[sum]与(1原创 2015-06-10 21:34:42 · 720 阅读 · 0 评论 -
uva 11636
题意:有n个句子要打印,先手打一遍,问最少复制粘贴几次可以达到目标数量。题解:容易得出答案是log2(n)向上取整。#include #include const int N = 10002;int ans[N];int main() { int n, cas = 1; ans[0] = 0; for (int i = 1; i < N; i++) ans[i] = c原创 2015-01-31 16:05:25 · 653 阅读 · 0 评论 -
uva 11029
题意:计算n^k的前三位和后三位。题解:后三位可以用快速幂取模得到,前三位计算时 n^k = 10 ^ (k * log10 n)。那么计算10 ^ (k * log10 n)的前三位就是10 ^ (2 + fmod(k * log10 n, 1)),例如10^3.5就是10^3 * 10^0.5,10^3决定10^0.5小数点后移3位,因此10^(k * log10 n)的前三位一定是k *原创 2015-01-11 20:46:31 · 856 阅读 · 0 评论 -
uva 10006(幂取模)
题意:判断一个数n。如果满足不是素数,并且 (0 题解:用幂取模的公式,为了提高效率用分治法。#include #include #include int pow_mod(int a, int n, int m) { if (n == 1) return a; int x = pow_mod(a, n / 2, m); long long ans = (lon原创 2014-11-24 20:38:31 · 557 阅读 · 0 评论 -
uva 138
题意:题解#include #include #include const int N = 100000000;int main() { for (int i = 2; i <= N; i++) { double j = (double)i; double temp1 = sqrt(j * (j + 1) / 2); int temp2 = temp1; if原创 2014-11-24 20:42:10 · 535 阅读 · 0 评论 -
uva 10717
题意:给出一些硬币的高度,和你要设计的椅子腿的高度,每个椅子的一条腿用不同的硬币来组装,问得到的椅子距离目标值最小的两种高度是多少(小于目标值,大于目标值)。题解:遍历存储所有硬币的每4个组成一组,求出他们的最小公倍数,然后暴力找出距离目标值最小的两种值。#include #include const int N = 55;const int INF = 0x3f3f3f3f;原创 2015-01-08 19:18:36 · 849 阅读 · 0 评论 -
uva 10820
题意:给出一个数字n,问小于等于n的两个数一共有多少个互质组合。题解:先用欧拉函数,求小于等于n的和n互质的数的个数,可以迭代求出小于等于n的互质组合。#include #include #include const int N = 50005;int res[N], n;int main() { res[1] = 1; for (int i = 2; i < N; i原创 2015-01-08 21:02:32 · 705 阅读 · 0 评论 -
uva 11384(数学)
题意:给了n,用最少的操作数可以让序列1, 2, 3 ... , n全变成0,操作是在序列中挑选1个或多个数字减去一个正整数。题解:找规律,保证序列中1 -- n / 2的数不变,然后将剩下的数减n / 2 + 1,这样f(n) = f(n / 2) + 1,递归可解。#include int f(int n) { return n == 1 ? 1 : f(n / 2) +原创 2015-01-28 17:05:47 · 534 阅读 · 0 评论 -
uva 10375(数论)
题意:给了p, q, r, s四个数字,求C(p, q) / C(r, s)。题解:直接计算,因为乘除运算顺序不定,可以边乘边除。#include #include using namespace std;int main() { int p, q, r, s; while (scanf("%d%d%d%d", &p, &q, &r, &s) == 4) { q = m原创 2015-01-28 17:59:11 · 754 阅读 · 0 评论 -
uva 10795(汉诺塔)
题意:汉诺塔问题,有n个盘子大小不同,编号大的更大,有三个柱子可以套盘子,盘子必须小的在大的上面,每次只能移动一个盘子,给出初始状态和目标状态,问最少几步可以从初始状态到目标状态。题解:如果盘子k的初始和目标位置是相同的且编号最大,那么不需要移动,否则需要把编号比k小的放到一个柱子(fin)上,盘子k在另一个柱子(beg)上,剩下柱子(tar)为空,这是一种参考状态,可以通过让盘子的初始状原创 2015-01-28 22:05:57 · 749 阅读 · 0 评论 -
uva 11027(数论)
题意:给一个字符串,把它的所有回文串按字典序排序,然后给了个n,要求输出第n个回文串是什么,如果没有就输出XXX。题解:首先判断是否存在第n个回文串,用一个数组f[i]表示A(i),那么一个字符串的排列方式就有num += A(len) / A(i),其中len是字符串长度,i是指第i个字符的个数,然后先将字典序最小的字母放到两端,然后判断此时剩下的字符串有x种排法,如果x #in原创 2015-01-29 21:02:45 · 654 阅读 · 0 评论 -
uva 10056(数论)
题意:有n个人投色子,并给出了一件情况的成功概率,从第一个人开始投色子,到最后一个人,周期性循环,直到有人完成了目标情况,问第I个人成功的概率是多少。题解:第I个人成功的概率应该是,第一轮胜利概率k1 + 第二轮胜利的概率k2 + ...直到kn,kn非常小。#include int main() { int t, n, I; double p; scanf("%d", &t原创 2015-01-29 22:21:11 · 639 阅读 · 0 评论 -
uva 571
题意:给了a,b两种容量的杯子(a 题解:直接模拟,还有个简便算法,因为a和b互质,那么a * 1 % b到a * (b - 1) % b将会出现1到b - 1的所有数且不重复,那么就会有n的存在(n #include #include int main() { int ca, cb, n; while (scanf("%d%d%d", &ca, &cb, &n) ==原创 2015-01-09 21:04:37 · 691 阅读 · 0 评论 -
uva 10105(数论)
题意:先给出n和k,然后给了从n1到nk个数字,要求输出多项式展开后,(x1^n1)*(x2^n2)...(xk^nk)这一项的系数。题解:不知道怎么做,看了这个人的题解恍然大悟。。http://www.cnblogs.com/scau20110726/archive/2012/12/22/2829012.html#include #include const int N =原创 2015-01-28 17:38:54 · 608 阅读 · 0 评论 -
lightoj 1104(期望)
题意:假设一年有n天,问至少有多少个人,能保证至少其中两个人的生日在同一天的概率大于等于0.5。 题解:要计算至少两个人的生日同天概率可以逆着算所有人不同天生日的概率小于0.5,那么人数就是x = 1 * (n - 1)/n * (n-2)/n * … 直到x是小于0.5的。#include <stdio.h>#include <string.h>#include <math.h>int n原创 2015-06-11 17:52:17 · 1073 阅读 · 1 评论