数论
the_conquer_zzy
计算机科学与技术专业
展开
-
hdu 1133
这题和卡特兰数很像。但是是组合数学,和大数的问题。 如果m=n 则是卡特兰数 这题需要用组合数学考虑。 n>m 为0 很容易得到 m+n 个人排队,总的排队是 C(m+n,n) 最后再乘以 m! 和n!. 用0表示拿50元的人,1表示100元的人。 则排队方式是 m个0 和n个1 的组合, 再乘以m!n!. 对于会停止的排队方式,也就是非法方式是:m每个0,n个1 的非法排队原创 2017-08-07 17:57:11 · 222 阅读 · 0 评论 -
hdu 1212
主题思想: 秦九韶算法,同余定理。(a+b)mod n= a mod n+ b mod n (a*c) mod n= amodn *c mod n对于字符串,12345789 .. 转化为数字, 1*10^(n-1)+2*10^(n-2) 等于 (((1*10)+2)*10+3) …int num=0;for(int i=0;i<s.length();i++){ num=n原创 2017-08-26 13:21:54 · 242 阅读 · 0 评论 -
hdu 1124 圆桌会议
主题思想: 数学题, 给一个串数字组成一个环,12345…n 经过有限次相邻作为的对换, 变成 1,n,n-1,n-2,…2 如果是一个直线,不是一个环,根据直线长度n 需要的次数为n-1+n-2+n-3+…+1. 为 n*(n-1)/2 把一个环尽可能分成长度相等的两段, 分别计算两段直线的次数,和就是最小的操作。 参考博客: http://blog.csdn.net/lulipe原创 2017-08-26 17:51:21 · 272 阅读 · 0 评论 -
hdu 1215 七夕节
主题思想 ,求因子和,打表,求因子,还是需要点技巧的。求 maxn 以内数的因子和 代码: int m=maxn/2; memset(a,0,sizeof(a)); for(int i=1;i<=m;i++){ // j must can divide by i j%i is 0 for(int j=2*i;j<maxn;j+=i){原创 2017-08-26 18:42:46 · 189 阅读 · 0 评论 -
hdu 1216
主题思想: 简单模拟,打表先执行一遍,算出第3000个数的大小,然后,以第3000个数,为上限,申请数组空间,和执行初始化,最后AC#include <iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int INF=34000;const int maxn=3005;int原创 2017-08-26 22:13:48 · 223 阅读 · 0 评论 -
hdu 1222
主题思想: 数论 线性同余参考博客: http://blog.csdn.net/y11201/article/details/8600337AC 代码:include includeusing namespace std;int gcd(int m,int n){if(n==0){ return m;}int ans=gcd(n,m%n);return ans;}int main原创 2017-08-27 16:59:22 · 278 阅读 · 0 评论 -
hdu 1201 18岁生日
这是一个具有常识性的数学问题主要考虑,出生年份是在3月前,还是在3月及3月以后 如果他的生日在1、2月,那么就以当前年为起始年份,如果今年是闰年就要加一了; 如果他的生日在3月及以后,当前年是不是闰年没有影响,下一年作为起始年份考虑。 参考博客:http://www.cnblogs.com/ACDoge/p/6133186.htmlAC代码:#include <iostream>#inclu原创 2017-08-23 20:25:34 · 194 阅读 · 0 评论 -
hdu 1250 大数
主题思想: 一看知道属于大数问题, 然后就写了字符串模拟大数加法,超时,后来又发现可以节省几个步骤,写了大数减法,又超时。 以后只要是大数问题,不再尝试 c++ ,直接用java写。这次又遇到一个用int模拟大数的新思路。用一个int位,来代替4位的字符串位,来模拟大数加法。#include<iostream>#include<cstdio>#include<cstring>#inclu原创 2017-09-14 22:02:26 · 301 阅读 · 0 评论 -
hdu 1273 漫步森林
主题思想: 这是一道数学规律题,那么怎么分析找出这个规律呢??分析思路如下,从一个点出发,再回到这个点需要消耗2条边,如果存在不同路径,每次路径不同,就从这个点的所有连接边中再找两条不同边,必定会消耗掉。一个点有(n-1)条边, 那么最多有(n-1)/2个不同的可能。因为每个顶点,都有n-1条边,所有肯定有(n-1)/2 个不同路径参考博客:http://blog.csdn.net/acmer_h原创 2017-09-23 11:19:25 · 270 阅读 · 0 评论 -
hdu 1284 钱币兑换
主题思想 : 这题有两种主流思路: 母函数方法,和动态规划方法。先说母函数方法,母函数方法,模拟多项式乘法,这里,有个技巧就是,利用数组下标表示多项式指数。 模拟 (1+x+x^2+x^3+x^4+…)(1+x^2+x^4+x^6+…)(1+x^3+x^6+x^9+…) 由于是n是有限制的,所以开辟n+1大小的数组,模拟乘法。int a[maxn]; int b[maxn]; f原创 2017-09-27 13:48:15 · 239 阅读 · 0 评论 -
hdu 1286 找新朋友,欧拉函数
主题思想: 欧拉公式的使用。 欧拉公式是指求一个数n,从[1,n-1] 中与n互质的个数。欧拉函数Euler(n)= n*(1-1/p(1))(1-1/p(2)) …(1-1/p(n)) p(1),p(2),p(n) ,是n的质数因子。欧拉公式int Euler(int n){ int ans=n; for(int i=2;i*i<=n;i++){ if(n%i原创 2017-09-27 20:10:48 · 190 阅读 · 0 评论 -
hdu 1288 Hat's Tea
主题思想: 贪心。思路如下: 如果总金额小于茶的价格,或者茶能被5角支付剩下来的零钱大于1角的个数(此时只能用1角支付),或者茶能被10角支付剩下来的钱大于5角和1角的总和,则不能支付。 能被支付的必然满足,零头能被满足。 接下来用1角支付, 如果1角的总和大于茶的价格,则能支付。1角不能完全支付,则,尽可能多的用1角,即除了用1角支付5角剩下的零头,如果剩下来1角的钱能替换5 角,就用5个原创 2017-09-27 22:05:17 · 240 阅读 · 0 评论 -
hdu 1290 切蛋糕
主题思想: 数学题。 这种题一般是有通项公式的,如果是平面,一般是 a*n^2+b*n+c ,如果是立体空间 ,一般是a*n^3+b*n^2+c*n+d。 可以采用待定系数法进行求解。由这道题很容易想到一个简单的题目。即n条线能把平面最多分为几块。f(n)=f(n-1)+ n;最后通项公式是 f(n)=(n+1)*n/2+1;如果是立体的。g(n)=g(n-1)+f(n-1) 递推得到原创 2017-09-28 10:47:57 · 334 阅读 · 0 评论 -
hdu 1293 The Number of Paths
主题思想: 数学题,递推公式推导,加大数加法, 大数加法,有两种思路: 一是,利用字符串模拟每一位,二是,利用int数组,用一个int表示多位数。 比如用一个int表示4位。代码如下:void F(){ memset(a,0,sizeof(a)); a[1][0]=3; a[2][0]=7; int t=0; for(int i=3;i<=1000;i++)原创 2017-09-28 16:13:28 · 378 阅读 · 0 评论 -
hdu 1297 Children’s Queue
主题思想: 首先推导出递推公式,F(n)=F(n-1)+F(n-2) +F(n-4)然后主要是用数组模拟大数加法,代码简洁,写起来比较快。数组模拟大数加法模板:void F(){ f[1][0]=1; f[2][0]=2; f[3][0]=4; f[4][0]=7; int t=0; for(int i=5;i<maxn;i++){原创 2017-09-28 20:04:43 · 250 阅读 · 0 评论 -
hdu 1211 RSA
主题思想: 数学题, 扩展欧几里得算,就线性同余方程。d=gcd(a,b)可以得到, d=ax+by ax+by=gcd(a,b) 依据扩展欧几里得可以求出系数,x,y ,注意,x,y可能小于0,a*dmod b=gcd(a,b)=1 特别的如果gcd(a,b) 等于1,则 是,a模b的乘法逆元。 参考博客: http://www.tuicool.com/articles/mINrQn原创 2017-08-26 12:58:31 · 240 阅读 · 0 评论 -
hdu 1210 洗牌
主题思想: 找规律跟踪第一张牌的位置,如果第一张牌回到了起点,则整体到了初始顺序。 对于第i张牌 if(i>n) 找规律发现,n+1,n+2,n+3其位置为1,3,5, =2*(i-n)-1 else i=2*iAC代码#include <iostream>#include<cstdio>#include<cstring>#include<queue>using name原创 2017-08-26 11:01:30 · 220 阅读 · 0 评论 -
hdu 1141 Factstone Benchmark
主题思想: 用对数来缩小数的量级。 因为数实在太大了。n!<2^x. 给出x 求出n.利用对数把乘法变成加法,且减小量级。log2(n!)<log(2^x)=xlog2(1)+log2(2)+...+log(n)<xAC 代码#include <iostream>#include<cstdio>#include<cmath>using namespace std;const in原创 2017-08-07 22:39:32 · 245 阅读 · 0 评论 -
hdu 1143 技巧
n 为奇数 0 n为偶数, dp[2]=3; 令dp[0]=1; dp[1]=0; dp[3]=0;递推发现:其实我并没有发现,都是人家发现的 汗…… 如果最后两列拼满 则为dp[n-2]*dp[2]=dp[n-2]*3; 如果最后两列拼不满一定是最后四列拼满的,两列拼不满有2中拼法我看不懂啊, 不说了,反正最后就是得到一个通项公式 dp[i]=4*dp[i-2]-dp[i-4原创 2017-08-08 20:21:51 · 254 阅读 · 0 评论 -
hdu 1145
概率计算题 不是很理解参考博客: http://www.acmerblog.com/hdu-1145-so-you-want-to-be-a-2n-aire-1485.htmlAC代码:#include <iostream>#include<cstdio>#include<cstring>using namespace std;const double eps=1e-8;int n;doub原创 2017-08-08 21:36:17 · 352 阅读 · 0 评论 -
hdu 1173
数学题 ,因为只能正方向行走,所以总距离dist=sum{|x-xi|+|y-yi|,i=1..n} 所以x为xi中的中位数,y为yi中的中位数时,总距离最小代码:#include <iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1000005;double xp[maxn];原创 2017-08-16 11:41:28 · 256 阅读 · 0 评论 -
hdu 1097 数论
这题是快速求幂取模定理:a^(b) if b=2k+1 a^(b)=a^k*a^k*a if b=2k a^(b)=a^k*a^k快速幂求模#include <iostream>using namespace std;int main(){ int a,b; while(cin>>a>>b){ int ans=1; w原创 2017-07-26 16:27:07 · 163 阅读 · 0 评论 -
hdu 1121 差分计算 Complete the Sequence
思路:利用差分思想,计算有规律序列 参考博客: http://blog.csdn.net/wangjie_wang/article/details/9149683 http://rchardx.is-programmer.com/posts/16142.html题外话,:拉格朗日插值法也是希望找出n个数背后的通项公式。 差分的意思就是指,前一个数减去后一个数。 比如题中序列 1原创 2017-08-05 13:29:04 · 450 阅读 · 0 评论 -
csdn 1104 Remainder
首先养成解题思路 : 题目要求最小路径,,那肯定是BFS,又有顺序要求,那么只要保证正确的步骤 即 + - * %最先得到的答案肯定是满足题目的。 所以这道题大基调就是BFS,至于路径长度和路径有一个结构体进行记录。本文 是mod 运算。。 mod 和% 的区别是%是有负有正, mod根据题目定义 a=b*q+r; a%q=r; 0<=r#include <iostream>#in原创 2017-07-28 14:59:37 · 212 阅读 · 0 评论 -
hdu 1142
求N! 中0 的个数 参考别人的。 因子分解 分析如下: 只有2*5 才会有10,也就是0出现。 也就是求N中有多少个被5整除的数。 然后更新N=N/5;接着求。最后的总数就是0的个数,代码:#include <iostream>#include<cstdio>#include<cstring>using namespace std;int main(){ int t;原创 2017-08-06 17:20:25 · 189 阅读 · 0 评论 -
hdu 1128 求self-Num
self Num ,定义: 数n本身加上组成数n的各位数字之和。技巧: 遍历,标记出,selfnum 输出 非标记数。#include <iostream>#include<cstring>#include<cstdio>using namespace std;const int MAX=1000005;bool flag[MAX];int selfNum(int x){ int原创 2017-08-06 18:17:46 · 251 阅读 · 0 评论 -
卡特兰数及其应用场景
参考博客:http://blog.sina.com.cn/s/blog_7064e7850100y1xf.htmlhttp://blog.csdn.net/u012333003/article/details/23791979卡特兰数 令h(0)=1,h(1)=1,catalan数满足递推式[1] :h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h原创 2017-08-07 12:37:25 · 627 阅读 · 0 评论 -
hdu 1130 卡特兰数加大数
以后大数用java的BigInteger类好了代码/** create by zzy at 2017,2:03:40 PM*/import java.math.BigInteger;import java.util.Scanner;public class Main { static int max=105; static BigInteger[]h=new BigIntege原创 2017-08-07 14:34:53 · 208 阅读 · 0 评论 -
hdu 1131 卡特兰数,大数
这道题和hdu1130 是姊妹题。 hdu 1130是典型的卡特兰数题。这题又加了标签,所以总数是卡特兰数乘以n的阶乘。/** create by zzy at 2017,2:03:40 PM*/import java.math.BigInteger;import java.util.Scanner;public class Main { static int max=105;原创 2017-08-07 14:56:41 · 266 阅读 · 0 评论 -
hdu 1205 吃糖果
主题思想 : 组合数学参考博客: blog.csdn.net/qinmusiyan/article/details/8104448 如果最多种类糖果的个数 为maxn,则maxn 个糖果至少需要maxn-1个挡板,也就是其他种类的糖果。 如果 sum-maxn#include <iostream>#include<cstdio>using namespace std;int main(原创 2017-08-24 20:43:12 · 162 阅读 · 0 评论 -
hdu 1163
主题思想: 9余数定理 一个数各位数字之和如果不是一位数,则继续对结果执行求各位数字之和。最后得到一个一位数。这种计算操作称为求一个数的各位数字之和。 一个数各位数字之和等于对9取余数,如果余数是0,则各位数字只和是9。快速幂求模定理。 a^b if b==2k+1 a^b =a^k*a^k*a else if b==2k a^b=a^k*a^k快速原创 2017-08-13 11:50:42 · 274 阅读 · 0 评论 -
hdu 1299
主题思想: 核心技术点是,求一个数的素因子个数。 x 、y、n都是正整数,并且 显然,x >= n , y >= n ,现在假设 y = n +k (k为正整数) ,那么带入公式,可以得出 x = (n*(n+k))/k = n*n/k + n; 由于x 是正整数,现在的关键问题就是要求出 n*n/ k 有多少组正整数的可能,显然,所要求的就是 n*n 因子的个数// 问题已经非常接近答案了,但是原创 2017-10-16 23:24:00 · 234 阅读 · 0 评论