随笔分类 - 数论
摘要:题意是给定了一个叫“jamcoin”的定义,让你生成足够数量满足条件的jamcoin。 jamcoin其实就可以理解成一个二进制整数,题目要求的要么长度为16位,要么为32位,一头一尾两个位必须是1,然后就是这个数字串在各种进制下表示的数都不能是质数。 我的做法很简单,因为大致口算了一下,满足条件的
阅读全文
摘要:这题就是个公式,代码极简单。但我想,真正明白这题原理的人并不多。很多人只是随便网上一搜,找到公式a了就行,其实这样对自己几乎没有提高。鉴于网上关于这题的解题报告中几乎没有讲解原理的,我就多说几句,也不是严格的证明,给大家分享一下。题目是说有p人或q人吃蛋糕,需要提前把蛋糕切好而能同时满足这两种情况,...
阅读全文
摘要:这题真是过了n年才a。最早是在2010年北大培训比赛上看到的这题,当时我不会,竹教主也不会,但他记下来了,研究一段时间后就会了,还把这题加到我校oj上。过了这么多年,我上网搜,关于这个问题的解题报告还是没有,于是我花了几天时间做了出来,发布此解题报告。题目是要求从1到n的所有数与n的最小公倍数的和,...
阅读全文
摘要:这题也是2011百度之星的一道题。知道做法后代码极简单。不过我做完后随便上网搜了一下,发现竟然还有很多不同的做法。别的做法我就不管了,我只把我的做法的原理说清楚。我做题时是按如下顺序逐步找到规律的:① 因为可以旋转,所以a和b的具体值无所谓,只在乎b-a的值;② 进一步,如果b-a等于1,那么无论原...
阅读全文
摘要:题目就是指定n,求卡特兰数Ca(n)%m。求卡特兰数有递推公式、通项公式和近似公式三种,因为要取余,所以近似公式直接无法使用,递推公式我简单试了一下,TLE。所以只能从通项公式入手。Ca(n) = (2*n)! / n! / (n+1)!思想就是把Ca(n)质因数分解,然后用快速幂取余算最后的答案。...
阅读全文
摘要:题目是求fun(n)的值fun(n)= Gcd(3)+Gcd(4)+…+Gcd(i)+…+Gcd(n).Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n-1])C[n][k] means the number of way to choose k things from n ...
阅读全文
摘要:这题的结果[f(1)+f(2)+...+f(n)]其实就等价于x*y*z<=n的解的个数,然后的方法几乎就是暴力枚举了。现场比赛的时候没想到这一点,太杯具了,浪费了两个小时的思考时间。其实我们的做法应该是可行的,因为f(n)具有积性性质,也就是若gcd(n, m)=1,则f(n*m)=f(n)*f(m)。而当p为质数时,f(p^k)=(k+1)*(k+2)/2,这样就能把f(n)数列的前n项和化成一堆多项式的加和。然后用合并同类项的思想,用容斥原理搞,可是代码量太大了,没打出来。。。今天赛题被挂到HDOJ上以后用上面说的枚举方法打了一下,交上去居然WA,调了半天也没发现错误,最后才怀疑是
阅读全文
摘要:这题公式不难推,就是控制精度的问题。因为公式是一些项求和,这里每一项都是接近于1的数,但是每一项里包含一个组合数和一个p^n,如果每次直接把p^n乘进去就会使数字太小,如果一直留到最后乘,可能中间就溢出了。解决的办法就是根据中间变量的大小动态地乘p^k,防止溢出,也防止数字太小丢精度离比赛结束已经有一段时间了,今天再来看这题,打算把它A掉,结果查了一下解题报告,发现这题其实有不需要控制精度的方法!!!唉,当时太SB了,这种方法居然都没想到,花了一两个小时去控制精度。其实只要在运算过程中全部取对数就可以了。。。。啊啊啊。。。/* * hdu4465/win.cpp * Created on: 2
阅读全文
摘要:类似于骨牌问题。我的做法就是首先看能不能横着排满,然后看能不能竖着排满,都不行的话就考虑一些横着排,一些竖着排,看能不能满足要求,最后也就转化为求ax+by=n有没有非负解的问题。可是我用扩展欧几里得打了,超时,无奈只能纯枚举了,枚举放1个、2个、3个...直到放不下为止。这说明测试数据很操蛋。/* * hdu2965/win.cpp * Created on: 2012-11-4 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath&
阅读全文
摘要:这题本来完全没思路的,后来想一想,要不打个表找找规律吧。于是打了个表,真找到规律了。。。打表的代码如下:int n;void dfs(int x1, int y1, int x2, int y2) { if (y1 + y2 <= n) { dfs(x1, y1, x1 + x2, y1 + y2); printf("%d/%d\n", x1 + x2, y1 + y2); dfs(x1 + x2, y1 + y2, x2, y2); }}void print_farey(int n) { printf("0/1\n"); df...
阅读全文
摘要:这题考查的内容还是比较多的,不过仅限于思路,如果模板准备充足的话还是很快的。这题首先要对问题进行转换。题目是给一个L,问由8组成的最短的能被L整除的数。不妨设长度为x。那么就是要求最小的x使8*[1+10+10^2+...+10^(x-1)] ≡ 0 (mod L)。也就是求最小的x使(8/9)*(10^x-1) ≡ 0 (mod L)。也就是求最小的x使10^x ≡ 1 (mod y),其中y = 9 * L / gcd(8, 9 * L)。于是存在满足题意的x当且仅当gcd(10, y) = 1。对于有解的情况,显然,x = φ(y)时,10^φ(y) ≡ 1 (mod y)成立,且每个符
阅读全文
摘要:这题是去年成都网络赛的题,当时没做出来,杯具呀。其实最关键的就是要懂得取余一定会循环的,如果能够找出循环节,就是一个巨大的突破。然后就是g(n)的求法,很显然硬求是不可能的,我们去年做这题的时候试图去找g(n)的通项公式,都找得差不多了,但实际上那毫无意义。因为我们是要找循环节,所以应该一层层地找。先看g(n) % 1000000007到哪里会循环。可以用矩阵的方法求g(n),暴力打出来,发现循环节是222222224。再来看g(g(n)) % 1000000007到哪里会循环。因为g(g(n)) % 1000000007对g(n)每隔222222224结果就会循环一次,所以g(g(n)) %
阅读全文
摘要:根据题意构造变换矩阵即可。有很多构造矩阵的方法。例如,假设原串长度为7,则我构造的矩阵M如下:1 1 0 0 0 0 00 1 1 0 0 0 00 0 1 1 0 0 00 0 0 1 1 0 00 0 0 0 1 1 00 0 0 0 0 1 11 0 0 0 0 0 1每次用M右乘原始矩阵就相当于一次变换,用快速幂就可以过了。不过这道题测试数据有点坑爹,我直接用的矩阵模板,超时,手动把矩阵乘法部分改成位运算形式就过了。。。估计之前超时也就超那么一丁点吧,估计加个输入外挂也能过。。。/* * hdu2276/win.cpp * Created on: 2012-11-3 * Author
阅读全文
摘要:读不懂题目的孩子伤不起啊~~~~~~~这题我第一次理解为n的所有约数的立方和,打完一看,样例都不对。。。再读读题,以为是求出n的约数个数x,然后求1^3+2^3+3^3+...+x^3,打完了也能过样例,交上去却WA。。。无奈只好翻别人的解题报告看,才明白题目的意思是求g(n)=∑f(d)^3 (d|n,f(n)表示n的约数个数)易证g(n)为积性函数,即若gcd(n,m)=1则g(nm)=g(n)*g(m)。所以对n分解素因数后N=p1^a1 * p2^a2 ……pj^aj,则可得g(n)=g(p1^a1)*……g(pj^aj)。而对于每个g(p1^a1)=1^3+……(a1+1)^3=(a
阅读全文
摘要:题目还是挺简单的,就是硬算,先求出N的所有因数,然后一个个地加起来,最后再处理输出就行了。现场赛的时候,模板准备不足,这题居然打了一个多小时,唉,要是能早交20分钟,银牌就妥妥的了……杯具……/* * hdu4432/win.cpp * Created on: 2012-10-26 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#
阅读全文
摘要:我校OJ1110题跟poj2480题目是一样的,最大公约数和,思路挺简单,就是求出n的所有约数pi,然后f(n) =Σ(pi*Φ(n/pi))。代码打得挺乱的,POJ上1Y了,可本校OJ死活过不了,TLE,竹子出题真是变态啊,有空再优化吧,先贴个代码。/* * poj2480/win.cpp * Created on: 2012-9-27 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime&
阅读全文
摘要:比赛的时候,2点半就想出该怎么做了,打代码打到3点半,还在调试,最可恨的是比赛结束还没过,一直WA,比赛完以后再测了测,发现是一处小错误。。。/* * A/win.cpp * Created on: 2012-9-8 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include
阅读全文
摘要:还是比较简单的,看题目的数据范围,貌似简单判断素数的方法(复杂度sqrt(p))也能过,不过手上有素数测试的模板,就直接用了。秒杀。。。/* * hdu1905/win.cpp * Created on: 2012-7-12 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#inc
阅读全文
摘要:开始题目看岔了,以为还挺复杂的,打了半天才发现题目是说对2008^N求约数和再计算,不是对N,于是就很简单了。。。/* * hdu1852/win.cpp * Created on: 2012-7-10 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <qu
阅读全文
摘要:/* * hdu1787/win.cpp * Created on: 2012-7-9 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#include <map>#include &l
阅读全文
浙公网安备 33010602011771号