数论
Joyyiwei
这个作者很懒,什么都没留下…
展开
-
UVA - 138 Street Numbers
题意:有两个数分别是m,n,求前10组1 + 2 + ... + m-1 = m+1 + ... + n的m和n,用求和公式退出2*pow(m,2) = (n+1)*n,然后就是枚举成立的情况,当然因为数据少,也是可以打表节省时间#include #include #include #include #include using namespace std;const int原创 2013-10-12 19:08:32 · 739 阅读 · 0 评论 -
UVA - 10006 Carmichael Numbers
题意:判断是否对于所有情况都成立,用到了打素数表和幂取模,LRJ上都有详细的代码#include #include #include #include #include using namespace std;const int MAXN = 65005;bool vis[MAXN];void isPrime(int n){ memset(vis,false,siz原创 2013-10-12 20:52:32 · 730 阅读 · 0 评论 -
UVA - 128 Software CRC
题意:看了题解的解释,给你一个字符串(可能有空格,最多1024字符),每个字符代表一个数字,因为最多有256个字符,所以这个字符串其实是表示一个256进制的数字。但这还没完,在这个256进制数字要再加两位,组成一个新的256进制数字,这个数字要能被M=34943(这是个十进制数字)整除,要你输出新添加的那两个数字是什么,这两个数字要以16进制的形式输出,用空格隔开思路:就是大数取模的的原创 2013-10-13 14:38:23 · 669 阅读 · 0 评论 -
UVA - 106 Fermat vs. Pythagoras
题意:起初推不出来,看了题解说其实就是勾股数组(毕达哥拉斯三元组)的证明,所以看了这个,摘抄了一些解释:本原勾股数组(PPT)是一个三元组(a,b,c),其中a,b,c无公因数,且满足a² +b² =c²。很明显存在无穷多个勾股数组(abc同乘以n),下面研究abc没有公因数的情况,先写出一些本原勾股数组:case:(3,4,5) (5,12,13) (8,15,17) (7,24原创 2013-10-13 21:41:34 · 717 阅读 · 0 评论 -
UVA - 10673 Play with Floor and Ceil
题意:LRJ线性方程的题目,但这道题的特殊在于一定有整数解,因为如果floor(x/k) == ceil(x/k)的话,那么x一定是最大公约数的倍数,如果不相等的话,那么最多相差1,最大公约数是1,同样满足条件,所以一定成立,照着书来就行了#include #include #include #include using namespace std;void gcd(long lo原创 2013-10-14 23:11:46 · 706 阅读 · 0 评论 -
UVA - 11121 Base -2
题意:将N转化为-2进制,看到一个挺巧的方法,其实只要看它的2进制的1的位置,就可以确定了,依次变化符号就行了,因为只要有(2)^i,就可以确定第i位是1,否则是0#include #include #include #include using namespace std;const int MAXN = 110;char str[MAXN];int main(){原创 2013-10-15 20:54:42 · 1009 阅读 · 0 评论 -
UVA - 10791 Minimum Sum LCM
题意:给出一个n,如果几个数的最小公倍数是n的话,那么sum就是这几个数的和,求最小的sum,根据唯一分解定理,一个数可以唯一的分解为n=p1^a1*p2^a2....,确定最小公倍数是由每个素数的次方的最高决定,所以这是唯一确定的,接下来就是怎么凑成数,使得相加最小,因为a*b>a+b,这个不等式的意思是:如果将两个素因子乘在一个是不如分开好的,所以在程序中,我们只要逐一累加最高次数的那个数就行原创 2013-10-16 00:32:49 · 695 阅读 · 0 评论 -
UVA - 10717 Mint
题意:给你n种硬币厚度,m张桌子,让你求使得桌子平衡的数,一个要求输出不超过给定值的最大高度,一个是超过给定值的最小高度,其实就是求四个数的最小公倍数,利用公式lcm(a,b)=a*b/gcd(a,b),然后就是在枚举四种可能的同时找到最大和最小值,特殊的是当给定值恰好是最小公倍数的倍数时,最大最小值都是等于给定值#include #include #include #include原创 2013-10-16 14:03:49 · 739 阅读 · 0 评论 -
UVA - 10820 Send a Table
题意:输入n,定义一个二元组(x,y),满足1#include #include #include #include using namespace std;const int MAXN = 50010;int n,vis[MAXN],arr[MAXN];void init(){ memset(vis,0,sizeof(vis)); vis[1] = 1;原创 2013-10-16 20:49:35 · 702 阅读 · 0 评论 -
UVA - 571 Jugs
题意:通过三种操作是否能使B里面的水达到N,只有倒满和清空以及将A倒进B三种,数论的方法参考了别人的题解:传送口证明:当n从0到B-1变化时,r可以取到0到B-1之间的任何值,反正法:假设nA%B取值在0~B-1,当n从0到B-1变化时,r取不到0到B-1之间的任何值的话,证明存在n1!=n2的时候,r1==r2,现在再来证明:当n1!=n2时,r1!=r2,假设n1!=n2时,r1=原创 2013-10-18 13:35:19 · 767 阅读 · 0 评论 -
UVA 10183 How Many Fibs?
题意:求[a,b]之间的Fibonacci numbers,范围达到10^100,用到了高精度,然后测试了一下,到第500个的时候,长度就已经是105了,所以我们只要计算到第500个就行了,顺便复习了高精度#include #include #include #include #include using namespace std;char fib[550][170];vo原创 2013-10-24 11:09:01 · 721 阅读 · 0 评论 -
UVA - 11029 Leading and Trailing
题意:求前三位,后三位,后三位我们可以用快速幂解决,至于前三位是这样来的,因为n^k = 10^(log10(n^k))=10^(k*log10(n)),对这个数取整的话,小数部分再*100就是前三位了,显然前三位只受k*log10(n)小数部分的影响,最后再取整,还有后三位不够三位用0补#include #include #include using namespace std;原创 2013-10-18 14:56:56 · 1176 阅读 · 0 评论 -
UVA 10303 How Many Trees?
题意:设f[i]表示一共有i个元素时二叉搜索树的个数,那么依次取1~n-1作为根节点,那么左右子树元素的个数就分别是(0,n-1),......,所以f[n] = f[0]*f[n-1]+f[1]*f[n-2]...+f[n-1]f[0],其实也就是Catalan数,高精度的计算,递推公式是f[n]=(4n-2)/(n+1)*f[n-1]#include #include #include原创 2013-10-25 00:42:42 · 751 阅读 · 0 评论 -
UVA - 10308 Roads in the North
题意:在一棵二叉树里找最远的两个点的距离,题目的输入和树的构建的看了好久,每次将一个节点加进树里,DFS一次就可以了,因为他是二叉树,所以只要一次#include #include #include using namespace std;const int MAXN = 10100;long long ans = 0;int p[MAXN],next[MAXN];int原创 2013-10-18 21:24:43 · 1236 阅读 · 0 评论 -
UVA - 10105 Polynomial Coefficients
题意:求多项式的系数,套用公式:由(a+b+...+z)^n某一项是a^k+b^d+...+f^z 的话,那么他的系数就是n!/(k!*...z!)#include #include #include using namespace std;const int MAXN = 50;int ans[MAXN],m,k,a;void init(){ ans[0] =原创 2013-10-19 11:54:37 · 825 阅读 · 0 评论 -
UVA - 10375 Choose and divide
题意:求两个组合的商,利用数学阶乘的概念还是蛮简单的, m!C(m,n) = -------- n!(m-n)!例如这个,先找到n与(m-n)之间的较小值,然后式子就等于(p*...*(p-Min+1))/Max接下来就是简单的除法了#include #include #include #include using namespace std;原创 2013-10-19 19:55:29 · 929 阅读 · 0 评论 -
UVA - 11027 Palindromic Permutation
题意:觉得这里讲的不错 点击打开链接 ,详细看代码#include #include #include #include using namespace std;const int MAXN = 35;char str[MAXN],result[MAXN],cword;int vis[130],word[MAXN],cnt;long long n,F[MAXN],len;原创 2013-10-19 23:25:33 · 794 阅读 · 0 评论 -
UVA - 10491 Cows and Cars
题意:这里有讲的很完整的点击打开链接#include #include #include using namespace std;int main(){ int cow,car,show,temp; while (scanf("%d%d%d",&cow,&car,&show) != EOF){ int temp = cow + car - 1;原创 2013-10-20 10:55:19 · 1049 阅读 · 0 评论 -
UVA 10759 Dice Throwing
题意:求扔出色子总数大于等于x的概率,递推求出dp[i][j]代表扔i个色子有总数是j的个数#include #include #include #include using namespace std;long long dp[25][160];void init(){ memset(dp,0,sizeof(dp)); dp[0][0] = 1;原创 2013-10-20 15:17:35 · 1062 阅读 · 0 评论 -
UVA - 10056 What is the Probability ?
题意:n个人轮流扔色子,知道有人赢了,赢的概率是p,求第k个人赢的概率,P(k)=p*(1-p)^k-1*(1+(1-p)^n+(1-p)^2n....)就是第一轮,第二轮...才赢的所有情况最后得到P(k)=(1-((1-p)^n)^N)(N->无穷)/(1-(1-p)^n)取极限得到:p*(1-p)^k-1/(1-(1-p)^n)注意p=0的时候,直接结果是0.0000#i原创 2013-10-20 10:08:46 · 805 阅读 · 0 评论 -
UVA 10277 Boastin' Red Socks
题意:已知p/q是连续取的两次红袜子的概率,因为p/q=a/b(a-1)/(b-1),枚举,排除是double型时的可能就可以了#include #include #include #include using namespace std;long gcd(long long a,long long b){ return b==0?a:gcd(b,a%b);}int原创 2013-10-21 15:51:24 · 738 阅读 · 0 评论 -
UVA 10169 Urn-ball Probabilities !
题意:起初有一个红球,然后每次取一个球,然后在放进一个白球,然后再取出一个球,取两次算一次概率,两次都取到红球的概率为pi,一共取了n次,问至少有一次两个搜是红球的概率是多少,还有每次都是红球的概率有几位0,至少的话,我们就求每次都没取到的概率,然后在1-P就是答案了,设每次都是红球的概率是P,那么设P=10^a,a=log10(P),a一定是分数,且小于0,那么a=b(整数部分)+c(小数部分)原创 2013-10-21 16:45:08 · 794 阅读 · 0 评论 -
UVA 11181 Probability|Given
题意: 求N个人在超市购物,其中r购物,其他人不购物,求第i个人有购物的概率,先DFS求出N个人r个人购物的概率,然后利用条件概率的公式:P=P(A*I)/P(A),求出每个人的概率#include #include #include #include #include using namespace std;const int MAXN = 30;int N,r,vis[原创 2013-10-21 21:23:38 · 701 阅读 · 0 评论 -
UVA 10518 How Many Calls?
题意:涉及到矩阵的快速幂取模,这里有一篇关于快速幂取模的文章点击打开链接,题目要求的是求函数F(n)计算的次数,然后输出f(n) MOD m的结果,很容易知道f(n)=f(n-1)+f(n-2)+1,然后又看了这篇分析点击打开链接#include #include #include #include using namespace std;struct node{原创 2013-10-27 23:46:39 · 800 阅读 · 0 评论 -
UVA 10900 So you want to be a 2n-aire?
题意:参考这里点击打开链接#include#include#include#define MAXD 35int N;double T, q[MAXD];void solve(){ int i, j, k; double eq, f = 1, quit; f = q[N]; for(i = N - 1; i >= 0; i --) {原创 2013-10-22 23:23:32 · 1150 阅读 · 0 评论 -
UVA - 10334 Ray Through Glasses
题意:在n次的折射后一共有几条线,这里解释的很好点击打开链接#include #include #include #include using namespace std;const int MAXN = 1005;int n,f[MAXN][MAXN];void init(){ f[1][0] = 1; f[2][0] = 1; int a,c原创 2013-10-28 19:50:14 · 786 阅读 · 0 评论 -
UVA - 10229 Modular Fibonacci
题意:矩阵快速幂取模#include #include #include #include using namespace std;long long mod;long long p[]={1,1,1,0};void matrix(long long a[],long long b[],long long c[]){ long long q = a[0]*b[0]原创 2013-10-28 21:27:08 · 770 阅读 · 0 评论 -
UVA - 10862 Connect the Cable Wires
题意:看了大神的推理:点击打开链接然后得到公式f(n)=f(n-1)*3-f(n-2) (n>2),之后便是大数的计算#include #include #include using namespace std;const int MAXN = 2005;int len[MAXN],n;int f[MAXN][MAXN];void mul(int a,int b){原创 2013-10-28 14:21:08 · 841 阅读 · 0 评论 -
UVA - 763 Fibinary Numbers
题意: 将用斐波那切表示的二进制相加,题目说可能一个数可以有几种不同的表示形式,那么要求不存在两个相邻的1,至于二进制相加的时候有几个注意的地方,就是当ans[i]>=1的时候,如果ans[i-1]>=1的话,那么利用斐波那切的公式ans[i]=ans[i-1]+ans[i-2]处理使得不存在相邻的两个1,还有的就是当ans[i]>=2的时候,利用ans[i+1]=ans[i]+ans[i-1原创 2013-10-29 19:52:26 · 818 阅读 · 0 评论 -
UVA 11176 Winning Streak
题意:参考了大神的想法:点击打开链接用dp[i][j]表示前i场连续的W不超过j的概率,最后求dp[n][j]-dp[n][i-1]就行了,对于第i场比赛是w还是L,只要是第i场比赛的结果不会使得连续胜利场数超过j即可。那么我们从原概率中减去这种事件发生的概率即可【这种事件发生的概率是i次比赛的后面连续j+1场都获得了胜利,且再往前一场没有获得胜利】#include #i原创 2013-10-23 13:26:33 · 827 阅读 · 0 评论 -
UVA 10417 Gift Exchanging
题意:对于概率很无解,参考:点击打开链接#include #include #include #include using namespace std;double p[20][20];int num[10];int N;double ans;void dfs(int cur,double cp){ if (cur == N){ ans += cp原创 2013-10-23 23:44:11 · 715 阅读 · 0 评论 -
UVA 10236 The Fibonacci Primes
题意:打印在斐波那切数列中第n个素数,这题有要求的是只打印前九位的数字,也就是不会超过整型,所以用不到大数,然后在利用打印素数表的技巧就行了,超过9位的记得要处理#include #include #include #include using namespace std;const int limit = 1000000000;const int MAXN = 320005;原创 2013-10-29 21:25:43 · 925 阅读 · 0 评论 -
UVA 991 Safe Salutations
题意:连接圆上的n对点,要求不要相交,Catalan数的应用,试想一下,如果任选一条的如果使得线的一边的点数是奇数的话,那么我们显然是无法成功的,所以我们选择一条线后,线的两边都要是偶数个,例如n=4的时候,我们可以选择(0对,3对),(1对,2对),(2对,2对),(3对,0对)#include #include #include #include using namespa原创 2013-10-30 14:57:35 · 776 阅读 · 0 评论 -
UVA 10079 Pizza Cutting
题意:求几刀能将圆切成几份,画了一下,发现每次都增加的份数都是第几刀,所以公式就是1+n(n+1)/2#include #include using namespace std;long long n;int main(){ while (scanf("%lld",&n) != EOF){ if (n < 0) break;原创 2013-10-30 16:59:07 · 968 阅读 · 0 评论 -
UVA 10940 Throwing cards away II
题意:写了几个发现规律f(n)=f(2^m+k)=2*k,注意f(1) = 1,为此W了一次#include #include #include #include using namespace std;int main(){ int n; while (scanf("%d",&n) != EOF && n){ if (n == 1){原创 2013-10-30 18:07:00 · 743 阅读 · 0 评论 -
UVA 10519 !! Really Strange !!
题意:n个圆两两相交,将平面分成了几部分,假设已有n-1个圆,那么第n个圆将与前n-1个圆相交2*(n-1)个点,也就是2*(n-1)个弧,而一个弧将产生出一个新的部分,所以:f(n) = f(n-1) + 2*(n-1),推出公式:f(n) = n^2-n+2,大数,害我错了好几次的是:n=0时的特判#include #include #include #include #i原创 2013-10-31 00:21:35 · 726 阅读 · 0 评论 -
UVA 10359 Tiling
题意:求几种摆成2*n矩形的方法,可用的矩形有1*2,2*2的,对于摆到长度为n的情况有:1.在n-1的情况下,再放一个1*2,2.在n-2的情况下,放2个1*2,1个2*2的,大数#include #include #include #include #include using namespace std;const int MAXN = 300;int n,f[MAX原创 2013-10-30 21:06:05 · 732 阅读 · 0 评论 -
UVA 11069 A Graph Problem
题意:加入集合的条件是:1.任意两个数不相连,2.在满足1个条件下不能再将之前组成的集合加入新的元素。看了题解明白的意思,既然不能在已有的基础的上再加,所以我们每次都加能加了,所以对于已经选到n,只能加n+2,或者n+3,就行了,不用考虑n+4,那是n+2的事情,为了能够递推出答案,所以f(n)=f(n-2)+f(n-3)#include #include #include using原创 2013-10-31 18:16:44 · 780 阅读 · 0 评论 -
UVA 10918 Tri Tiling
题意:求几种方法构建成3*n的矩形,小的矩形只有1*2的,仿照uva 10359的思路f(n)=3*f(n-2)+2*f(n-4)...+2*f(2),递推出公式:f(n)=4*f(n-2)-f(n-4),当n是奇数的时候,f(n)=0#include #include #include using namespace std;const int MAXN = 100;int原创 2013-10-31 16:48:18 · 1055 阅读 · 1 评论 -
UVA 10910 Marks Distribution
题意:参考了大神的点击打开链接#include #include #include using namespace std;int n,t,p,m;long long C(int a ,int b){ if(b-a < a) a=b-a; long long ans=1; for(int i = 1; i <= a; i++)原创 2013-10-31 23:08:27 · 794 阅读 · 0 评论