数论
冰阔落
Stay hungry, Stay foolish, Stop when you are perfect.
展开
-
UVA - 10128 Queue
题目大意:有n个身高各异的人站成一排,如果某人比他左边所有的人都高,那么它可以往左看到整个队列以外,否则他的视线会被挡住,右边同样。犯罪就在这里开始了。队列左边有一个人用回旋镖杀死了队列右边的一个人。此时恰有P人向左的视野没有没遮挡,R人向右的时也没有被遮挡,这些人都可能是案件的目击证人。辩护律师委托你算出这N个人有多少种可能的排列方法满足给定的P和R。解题思路:递推,假设现在队列由i原创 2015-03-25 12:53:09 · 1740 阅读 · 0 评论 -
UVA 575 (暑假-数论 -A - Skew Binary)
#include #include #include int main() { char str[1000]; while (gets(str) && str[0] != '0') { int sum = 0; int len = strlen(str); for (int i = 1; i <= len; i++) { sum += (str[len - i] -原创 2014-07-22 08:40:37 · 1642 阅读 · 0 评论 -
UVA 568 (暑假-数论 -C - Just the Facts)
#include int main() { int n; while (scanf("%d",&n) != EOF) { int sum = 1; for (int i = 1; i <= n; i++) { sum *= i; while (sum % 10 == 0) { sum /= 10; } sum %= 100000; } pr原创 2014-07-22 08:43:59 · 1570 阅读 · 0 评论 -
UVA 350 (暑假-数论 -E - Pseudo-Random Numbers)
#include int main() { int z, i, m, l, t = 0; while (scanf("%d%d%d%d", &z, &i, &m, &l) && (z || i || m || l)) { int value[10001] = {0}, count = 0; while (++count) { l = (z *l + i) % m; va原创 2014-07-22 08:46:50 · 2176 阅读 · 0 评论 -
UVA 10392 (暑假-数论- G - Factoring Large Numbers)
#include #include int main() { long long num; while (scanf("%lld", &num) && num != -1) { for (long long i = 2; i <= sqrt(num); i++) while (num % i == 0) { printf(" %lld\n", i); n原创 2014-07-22 08:48:57 · 1626 阅读 · 0 评论 -
UVA 10879 (暑假-数论 -H - Code Refactoring)
#include int main() { int t, n = 0; scanf("%d", &t); while (t--) { int k, arr[4], count = 0; scanf("%d", &k); for (int i = 2; count < 3; i++) if (!(k % i)) arr[count++] = i, arr[cou原创 2014-07-22 08:47:49 · 1578 阅读 · 0 评论 -
UVA - 10910 Marks Distribution
题目大意:首先,如果总的分数不够的话,肯定输出0。之后我们就可以把问题转化成这样了,假设多出来的分数为p,那么把p个相同的小球放到N个盒子里,每个盒子可以为空,一共有多少种方法?解题思路: 解决上面说的这种放小球的问题可以用“隔板法”,N-1隔板隔开的小球的情况就是相应每个盒子里小球的状况,由于盒子可以为空,就相当于p+N-1和空位选出N-1个位置放隔板的方法数,那么结果就是C(原创 2015-03-30 22:00:55 · 1581 阅读 · 0 评论 -
UVA - 10943 How do you add?
题目大意:求 K 个不大于 N 的非负整数有多少种情况使得 K 个整数的和为 N。解题思路:这个问题可以等效成有 N 个相同的小球放到 K 个不同的盒子里,每个盒子可以为空,求一共多少种放置的方法?答案容易用隔板放求得为C(N+K-1,K-1),但由于组合数的递推公式里面有除法,所以我们不能每步都用模运算。鉴于这个题目 N 和 K 比较小,我们可以用递推公式 C(m,n)=C(m-1,n)+C原创 2015-03-21 12:58:30 · 1541 阅读 · 0 评论 -
UVA - 10721 Bar Codes
题目大意:给出n,k和m,用k个1~m的数组成n,问有几种组成方法。解题思路:简单dp,cnt[i][j]表示用i个数组成j, cnt[i][j] = ∑(1 ≤ t ≤min(k, j)) cnt[i - 1][t].#include int main() { int n, k, m; while (scanf("%d%d%d", &n, &k, &m) != EO原创 2015-03-20 21:03:41 · 1583 阅读 · 0 评论 -
UVA - 696 How Many Knights
题目大意:给出一个n * m的网格,计算最多可以放置几个国际象棋中的骑士。解题思路:分成三类来讨论: 1)min(n, m) == 1, 也就是无论怎么摆也不会影响到其他的骑士。 2)min(n, m) == 2, 这是将网格将网格分成2*4的若干部分,每个部分的前半部分放置骑士,主要注意模4后剩余部分的处理。 3)n * m的网格上间隔摆放(就是对应的黑原创 2015-03-20 19:57:47 · 1548 阅读 · 0 评论 -
UVA - 11582 Colossal Fibonacci Numbers!
题目大意:两个非负整数a,b解题思路:显然a^b只能用快速幂,而且还必须要取模,所以去尝试找f(n)mod x 的周期当二元组(f [i], f [i-1])=( f [0], f[1] ) 的时候开始循环,所以周期为i - 1因为 f [n] % x 的余数最多只有1000种所以在 f [0...n^2] 以内就能找到周期#include typedef unsi原创 2015-04-27 23:23:01 · 1712 阅读 · 0 评论