
数学方法
文章平均质量分 63
BRCOCOLI
初学者 记录成长 Fighting
展开
-
UVA 11582 Colossal Fibonacci Numbers!
原则1:n的余数最多有n种,所以最多n^2就会一个循环,就想400前后同一天星期几也一样,是个至少要满足的循环n是1~1000,f函数从第3项开始算时间超出,所以直接打表#include#include#include#include#includeusing namespace std; const int maxn=1000+5;int ans[maxn][maxn*6]原创 2016-07-05 16:05:40 · 228 阅读 · 0 评论 -
UVA 1635 Irrelevant Elements
看到一个很大的数字的什么什么的余数就要想到唯一分解定律#include#include#include#include#include#includeusing namespace std;void Getprimes(int n,vector& p){ int m=sqrt(n+0.5); for(int i=2;i<=m;i++) { if(n%i==0) {原创 2016-07-06 11:16:43 · 271 阅读 · 0 评论 -
UVA 1638 Pole Arrangement
如果考虑l代表右边比他高的有几个,r代表左边高的有几个,l代表右边高的有几个那么会超级复杂,排列约束条件很多只能考虑有序化方便决策:从最矮开始排每增加一个会遮住很多柱子,没什么规律所以考虑从最大开始排,每插入一根会导致三种结果1)插到左边 使 r+1 只有一种插法2)插到右边 使l+1 只有一种插法3)插到中间 r,l不变 有n-2种插法定义个数组表示个数原创 2016-07-08 18:45:50 · 331 阅读 · 0 评论 -
UVA 12034 Race
递推假设第一名有i人 ,即C(n,i) i∈[1,n] ,剩下n-i个人的名次有f(n-i)种可能性,只要对于每种排名,将i个人都放在并列第一就是一种新的排名所以f(n)=∑f(n-1)*C(n,i);对于这i个人不需要考虑剩下如处于第二第三的情况,因为f(n-i)中已经包含这种情况了剩下就是计算C(n,m)的问题,使用公式c(n,m)=n!/[(n-m)!*m!] 肯定会原创 2016-07-08 16:07:55 · 277 阅读 · 0 评论 -
UVA 580 Critical Mass(递推)
递推思想就是把这一项递推到前一项,把问题简单化,例如Fibonacci数列f(n)=f(n-1)+f(n-2)题目的意思就是n个长度字符中至少有3个连续的U的字符有几种于是问题核心就是怎么递推,使问题规模减少假设答案为f(n),从第一个连续的U开始编号为第i,i+1,i+2个于是字符串可以分为3部分:第一部分为1~i-1设有g(i-1)种g(i-原创 2016-07-08 10:55:14 · 397 阅读 · 0 评论 -
UVA 1637 Double Patience(DP+概率)
一共9堆排,每堆牌有0~4 这5种状态,所以一共有5^9=1953125种状态定义:对于状态i,d[i]表示在这种状态下要成功的概率,也即是后序状态成功几率的平均值状态转移:也即是1)拿这两对相同的牌 2)拿下一对相同的牌状态选取:因为是计算总的成功的概率所以不存在最优的解概率计算:利用全概率公式,也即是 一个状态的成功的概率 等于 后续状态下的成功概率平原创 2016-07-07 17:19:25 · 1115 阅读 · 1 评论 -
UVA 1262 Password
#include#include#include#include#include#include#includeusing namespace std;vector Alpha[5];void GetAlpha(char a[][6],char b[][6]) //得到待选的字母表 { for(int i=0;i<5;i++) Alpha[i].clear(); i原创 2016-07-06 19:23:17 · 327 阅读 · 0 评论 -
UVA 10820 Send a Table
设f(m,n) 设m于是问题转化为求n的个数f(n)于是个数=2*f(n)+1其中1是f(1,1),乘以2表示,m,n反一反#include#include#include#include#include#includeusing namespace std;void phi_table(int n,int *phi){ for(int i=1;i<=n;i++)原创 2016-07-06 17:11:29 · 241 阅读 · 0 评论 -
小于n且与n互素的整数个数(欧拉函数)的计算
即计算1~n中与n互素的整数个数互素就是无法被n整除的数("与p互素"和"不是p的倍数"是等价的)所以第一种显而易见的方法就是暴力枚举法,但效率太低。第二种方法用唯一分解定律再运用容斥原理:分解定律:分为n=p1^a1*p2^a2......pk^ak;容斥原理:在计数时,要保证无一重复,无一遗漏。为了使重叠部分不被重复计算,在不考虑重叠的情况下,把包含于某内容中的所有对象的数原创 2016-07-06 15:46:18 · 7606 阅读 · 1 评论 -
UVA 10375 Choose and divide
运用到第一分解定律以下唯一分解定律证明:转自:http://www.matrix67.com/blog/archives/495为了真正地证明,分解质因数的方法是唯一的,我们将再次用到反证法。假设存在某些数,它们有至少两种分解方法。那么根据上文提到的“非空正整数集里存在最小的元素”,一定有一个最小的数M,它能用至少两种方法表示成质数的乘积:M = P1 * P2 * … * Pr原创 2016-07-05 17:32:41 · 545 阅读 · 0 评论