数论
文章平均质量分 56
ZXLS-ZMR
我喜欢编程喜欢学习新的知识
展开
-
HDU-1133 Buy the Ticket (Catalan数)
公式:(m+n)!*(m-n+1)/(m+1)简单的大数运算。看似有除法,可以约去,大数相乘就行了。#include#include#includeusing namespace std ;int len;int M[305];void Mult(int *a,int k){ int Curlen=0,tmp; int carry=0; for(int i=0;i<原创 2014-03-03 21:53:17 · 829 阅读 · 0 评论 -
Codeforces-15C Industrial Nim
题意:有n个沙场,每个沙场有m个车子,每个车子里装的石子个是从第一车子里依次递增的。他们两相互取石子,问是先取赢还是后取赢。这题是裸的Nim游戏,ans=s1^s2......s3.s代表每一堆石子的个数。这题最主要不在于Nim游戏的结论,而是怎样在连续的自然数中快速求出前m个数的异或,这是基于一个理论:N^(N+1)=1,N为偶数,结合数学分类可以快速求出。#include#i原创 2013-11-04 20:04:24 · 876 阅读 · 0 评论 -
poj-1320 Street Number 佩尔方程
题意:求两个不等的整数(n,m)使得: 1+2+.....n=(n+1)+.....+m;分析:1+2+...n=n(n+1)/2=(n+1)+...m=(m-n)*(m+n+1)/2,即:(2m+1)^2-8n^2=1;设:x=2m+1,y=n,则:x^2-8y^2=1;这是典型的佩尔方程。已知x1=3,y1=1;有佩尔方程的迭代公式:x[n]=x[n-1]*x1+d*原创 2013-11-15 21:59:46 · 761 阅读 · 0 评论 -
poj-3233 Matrix Power Series(矩阵快速幂)
类似a^b的快速幂。很经典一道题。#include#include#includetypedef __int64 LL;using namespace std ;int n,M;LL k;struct matrax{ int m[35][35]; void unit(){ memset(m,0,sizeof(m)); for(int i=原创 2013-11-15 18:09:49 · 741 阅读 · 0 评论 -
HDU 4722 Good number 找规律
题意简单。这题一看就是找规律,没想到一下子就找到规律了。对于n所构成的数,在它前面的数每个位相加能被十整除的数刚好是sum=m/10-1+(m80.1234->1230.找到这个规律此题是很容易的。#include#include#include#includetypedef __int64 LL;using namespace std ;LL answer(char原创 2013-09-27 16:15:11 · 636 阅读 · 0 评论 -
poj 3641 Fermat 与素数的判断
题意:给出p和a,判断p是否为非素数并且也满足a^p=a(mod p),如果是,输出yes,否则输出 no。简单的素数判断!,与format定理的应用。#include#include#includetypedef __int64 INT;using namespace std ;bool Isprime(int num){ if((num>2&&num%2==0)||原创 2013-09-26 20:25:19 · 622 阅读 · 0 评论 -
ZOJ-2313 Chinese Girls' Amusement(详解)
题意简单.根据题意,有这样的理论:是找gcd(n,k)=1且k对于2m+1=n,即为奇数时,可以得出,k=m。->gcd(2m+1,m)=1;当2(2m+1)或4m时为偶数时,可以得出,k=2m-1。总的来说:当n为奇数,ans=n/2;当n为偶数,(1)4m=n, ans=n/2-1, (2) 4m+2=m ,ans=n/2-2;代码:#include#inc原创 2013-09-03 22:39:38 · 1294 阅读 · 0 评论 -
poj 2398-几何二分搜索
题目连接此题和poj2318一样。稍微有点的变化就是边的输入没有按从小到大。先排序就可以套用poj2318代码了。#include#include #includeusing namespace std;const int M=1005;struct node{ int l,r;}line[M];int xa,xb,ya,yb;int toys[M],cnt[M]原创 2013-08-17 14:51:48 · 667 阅读 · 0 评论 -
HDU-1106 快排模板 和 基数排序
基数排序:基数排序是一种线性的排序算法。设n个元素不超过d位,而且每位都介于0到9之间。基本思想是把最高位或(最低位)的数字看做第一关键字,次高位(次低位)数字看作是排序的第二关键字,一次类推..。 比如: 26 25 43 12 5 33 (按着次低位)先有十个桶:0 1 2 3 4 5 6 7 8 9 或m个桶0按个位 ---> (12) (原创 2013-08-14 17:35:32 · 977 阅读 · 0 评论 -
HDU-4666 最远曼哈顿距离
题目连接此题值得分析:曼哈顿距离:两个点所对应的坐标差的绝对值之和。比如在一维空间:x1,x2. d=|x1-x2|,二维空间:(x1,y1),(x2,y2) d=|x1-x2|+|y1-y2| 三维空间(x1,y1,z1),(x2,y2,z2)d=|x1-x2|+|y1-y2|+|z1-z2|,以此类推。。。看到绝对值,我们就想到去绝对值。如果在二维空间:d=|原创 2013-08-15 11:02:02 · 668 阅读 · 0 评论 -
UVA-10168 Summation of Four Primes
题意:将一个数分解成四个素数相加分析:最少的素数为2,所以该数至少为8=2+2+2+2.当n>8分为奇偶:由哥德巴赫猜想猜想,一个合数可以分解成两个素数相加,所以此题就是有点技巧了,但n为奇数,先取2,3剩下的就是偶数了,就可以分解了,当n是偶数去先取2,2剩下的还是偶数,也可以分解了。看似很难,其实很水。#include#include#include#include#d原创 2013-11-19 13:44:25 · 867 阅读 · 0 评论 -
UVA-10213 How many pieces of land
我没推出公式来,看别人的。维基百科上面的讲解。公式:C(n,4)+C(n,2)+1;果断用java写了。import java.math.BigInteger;import java.util.*;//import java.io.*;public class Main { //该题目是土地分割(圆分割)公式:C(n,4)+C(n,2)+1=(n^4-6n^3+23n^原创 2013-11-19 13:52:42 · 1208 阅读 · 0 评论 -
SOJ-4310 Sum of product
这题很容易想到用三层循环,但很明显超时,所以要优化。s1=a[n](a[n-1]*(a[n-2]+........a[1])+a[n-2]*(a[n-3]+......a[1])+.......a[2]*a[1])s2=a[n-2](a[n-2]*(a[n-3]+....a[1])+a[n-3]*(a[n-4]+.......a[1])+.......a[2]*a[1]).......原创 2013-12-03 19:27:06 · 809 阅读 · 0 评论 -
SOJ-4309 Sum of xor
由n^(n+1)=1,n为偶数即可分类求得。1^1=0,0^1=1,0^0=0,异或满足交换律。#include#include#includetypedef long long LL;using namespace std ;LL get_ans(LL n){ if(n&1) return (n-1)%4==0?1:0; return (n-2)%4==0?原创 2013-12-03 19:09:03 · 879 阅读 · 0 评论 -
poj-1845 Sumdiv (逆元+费马小定理+因子和)
分析:与hdu 1452很类似,就不详细解释了,详细解释;#include#include#includetypedef long long LL;using namespace std ;LL m[205][2];int cnt; void exgcd(LL a,LL b,LL &x,LL &y) { if(b==0){ x=1; y=0; return;原创 2013-11-13 14:28:05 · 859 阅读 · 0 评论 -
数论基础训练(2)-解题报告
A-排列又一次倒在stl-next_permutation函数了,虽然以前用过,但没明白函数运行的原理,原来它是先按字典序排列的,在从后面一次排列,交换顺序的,而且它可以再你给定的一个排列的位置,可以从现在的序列接着从后排列,当排列完的时候,它能回到第一个序列(即为最少字典序),而这题正是这么来着,无语了,这个函数一定要记住它。#include#include#include#inc原创 2013-11-13 19:46:52 · 856 阅读 · 0 评论 -
HDU-1452 Happy 2004(逆元+因子和+费马定理)
题意:S是对2004^x的因子的和,求S%29.分析:一个数的因子和公式:S=(p1^(x1+1)-1)/(p1-1)*(p2^(x2+1)-1)/(p2-1)*...(pn^(xn+1)-1)/(pn-1);其中pn,xn是一个m数分解成素数的指数幂的形式。由题意:2004^X=2^(2X+1)*3^(X+1)*167^(X+1);故有:S=2^(2X+1)*3^(X+1)*167^原创 2013-11-12 17:07:57 · 950 阅读 · 0 评论 -
POJ-2480 Loangge's problem
分析:因为:gcd(i,m*n)=gcd(i*m)*gcd(i*n),n与n互质,由于积性函数的和也是积性函数,f(n)=sgma(gcd(i,N),1f(p^r)=r*(p^r-p^(r-1))+p^r;#include#include#includeusing namespace std ;int main(){ int r; long long x,sum,n;原创 2013-11-11 16:38:09 · 735 阅读 · 0 评论 -
poj-3090 Visible Lattice Point 求前n欧拉函数值的和
题意:从(0,0)到(x,y)作一条线段,如果这条线段不经过其他的整点,那么称(x,y)是可见的。给出正方形的边n输出该平面所有可见的点。分析:从(0,0)到(x,y)不经过其他整点,也即是说x,y是不可约的。x,y是互质的,该问题就转化为1到n内互质的数的对数,所有课通过求前n个欧拉函数值的和来确定。AC代码:#include#include#includeusing n原创 2013-11-11 15:57:08 · 711 阅读 · 0 评论 -
数论基础练习赛-解题报告
A-prime Test Miller-Rabin 素数测试。不会搞,求不出最小质因子,数太大了。B-Prime cuts题意:给出n代表1-n之间的范围,m代表剪切素数的2*m或2*m-1的长度,从中间剪切,保证剩下的两端长度相同。分析:素数筛选,找到在n范围素数的个数,即等到k。设剪切首的位置为pos,末尾位置为endpos。根据题意:pos=n-1-endpos,原创 2013-11-10 20:19:39 · 999 阅读 · 0 评论 -
poj2635-大进制转化+同余定理+素数筛选
题目连接这题不知wA多小次了,先是打素数表超时,后是取余数超时。没法,在绝望的情况下看了大牛的,我无语了。。。。。题意:(英语基础不行,题意都很坑爹)。给你一个数,它是由两个素数相乘而得的,再给你一个数M,如果其中有一个素数小于该数M,就输出“BAD”,并且要输出该素数。只有两个素数都它大于这数M,才输出“GOOD”。(这题目废话真多!,何必呢?)分析题目: 一看到素数原创 2013-05-07 17:42:15 · 854 阅读 · 0 评论 -
HDU-1060 Leftmost Digit
这题本来不想贴,看上去很简单,但又不明白为什么能这样?这是么定理?#include#includeint main(){ int t; __int64 n; scanf("%d",&t); while(t--){ scanf("%I64d",&n); double a=n*log10(n*1.0); a=a-(__int64)a; //去小数的部分。 p原创 2013-08-12 11:00:54 · 674 阅读 · 0 评论 -
poj-1142 Smith Number(分解因子)
题意: 一个数分解成质因子相乘,原数的每个位相加等于分解后的数每个为相加的和。此题就是分解因子。主意,素数不能算,否则WA。#includetypedef long long LL;void bitsum(LL n,LL *s){ int t; while(n){ t=n%10; n/=10; *s+=t; }}int main(){ LL原创 2013-08-10 23:08:42 · 718 阅读 · 0 评论 -
HDU-4602 partition 找规律
分析:看了解题报告,先没看懂,后来恍然大悟。但k>n 显然是不存在的答案为0;当1分两种情况讨论, 取k个连续的点不包含端点。在n个位置区k个连续的点有n-1-k种,在就是把剩余的n-k-2位置任意分割,相当于n-k-2任意拆分,根据题意提供f(n)=2^n。很快就得到(n-k-1)*2^(n-k-2);如果含有端点,最前和最后,有2种,那么就有2*2^(n-k-1)加原创 2013-08-09 21:19:11 · 635 阅读 · 0 评论 -
poj 2115-扩展欧几里得。
题目连接获得详细分析:点击打开链接贴个代码:#includetypedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){ if(b==0){ x=1; y=0; return a; } LL d=exgcd(b,a%b,x,y); LL tmp=x; x=y; y=tmp-a/b*y; return d;}原创 2013-07-16 08:23:19 · 656 阅读 · 0 评论 -
poj-2478 求前n个欧拉函数值的总数(模板)。
题目连接分析: 此题只是换了一种形式提出问题的,实际可以把分数看成一对互质的数。那么要我们求得是:前n个数每个数的欧拉函数值的总数。欧拉函数是:数(n)与前n-1个数互质的个数。这题就是个模板题,没什么可解释的。代码:#include#define M 1001000typedef long long LL;int vis[M]={0};int prime[M/3原创 2013-07-15 21:05:48 · 893 阅读 · 0 评论 -
HDU-2524 简单的数论
#includeint main(){ int x,y,t; long long sum; scanf("%d",&t); while(t--){ scanf("%d %d",&x,&y); sum=x*(x+1)*(y+1)*y/4; printf("%lld\n",sum); } return 0;}先从x轴选取(1,2,3.....x)再从y轴选取(1原创 2013-07-15 17:09:53 · 676 阅读 · 0 评论 -
HDU1013-简单的数论
题意:就是把数的每个位数相加,看是否小于10,是就输出,否则继续。分析:本题不难,让我们做了是为了让我们知道一个结论。一个数(n)的树根k=(n-1)%9-1;知道这个这题就是水题了。不知道也没什么关系,也可以水过。(输入的数可能很大)知道就这个代码:#include#includeint main(){ char st[1005]; int r原创 2013-07-15 09:43:51 · 769 阅读 · 0 评论 -
poj3349-hash
题目连接分析:对于一个六边形,长度个不一个样,而物体可以旋转,这是一个很头痛的问题,该如何辨别这些相同的六边形,链表?这显然不好,用map行不通,想想看,比如:1 2 3 4 5 6和1 2 2 3 4 5,他们的和是不同的,所以我们直接就可以否定他们相同,但对于 1 2 3 4 5 6和 1 3 2 4 6 5,他们的和是相同的,但属于不同的六边形,这些数据有些好辨别,有些不好辨原创 2013-05-12 21:35:05 · 802 阅读 · 0 评论 -
poj3126-prime+BFS
题目连接分析:这题是在1000-10000之间,从一个素数变换到另一个素数。我们会想到先打印素数表,然后进行搜索。另外,对素数的变换,我们应进行为的变换。采用queue来存。代码如下:#include#include#include#includeusing namespace std;int k,m;int a[4]={1,10,100,1000};int原创 2013-05-25 10:28:18 · 797 阅读 · 0 评论 -
poj3292
#includeusing namespace std;#define MAXN 1000001int rec[MAXN],keep[MAXN];void make(){ int ans=0; for(int i=5;i<=MAXN;i+=4) { for(int j=5;j<=MAXN;j+=4) { int sum=i*j; if(sum>MAX原创 2013-05-08 18:40:55 · 614 阅读 · 0 评论 -
反哥德巴赫猜想,递归方程完美解决
题目连接分析:题目要求我们给定整数n,要你求在13~n之间的奇数,它可以表示两个合数相加,对于一个奇数,可能有多种方案,用g(n)表示,问你,要求出sg(n)=sum{g(i)|i这和以前的素数表有点类似,先就应该打合数表,然后推出关系,我们可以知道sg(n)=sg(n-2)+g(n),而g(n),n它是一个奇数,我们知道两个奇数相加一定是偶数,两个偶数相加是偶数,所以只有一奇一偶原创 2013-05-17 21:34:11 · 1259 阅读 · 0 评论 -
博弈?水题?说不过去。。。
题目连接分析;这题果然坑爹,水题竟然全然不知,还搞什么递推,搞什么博弈?,简直就是小题大做了。这题比较适合小学生人做,因为他们会一个一个地来枚举,发现一些规律。这题果然就有规律了。1 2 3 4 5 6 7 8 9 A A B A A B A A B 这题出的没水分。这个博弈只能用来骗小孩。#includeint main(){ int n; while(sc原创 2013-05-19 20:14:14 · 659 阅读 · 0 评论 -
HDU-1396 神奇的三角形。坑!
看似简单的题,却深藏杀机!这题一看就是递推题,我以向很喜欢这类型的题,这题非常容易着手。由于这类型题很容易找规律。比如这题。先看正立的三角形。画一图就可以得出f(n)=f(n-1)+2n-1+n*(n-1)/2;先前以为就可以水过了。答案却WA!。重新画一个图,终于发现原来还有倒立的三角形。从第4个就出现了一个,第五个出现3个(前一个,后两个),第六个出现了7个(多了一个倒立的)依原创 2013-07-15 16:26:42 · 861 阅读 · 0 评论 -
HDU-1465错排
错排公式: f(n)=(n-1)*[f(n-1)+f(n-2)];注意:在杭电上用__int 64,用long long 就WA了。#include__int64 f[21];void fun(){ f[1]=0; f[2]=1; for(int i=3;i<=20;i++) f[i]=(i-1)*(f[i-1]+f[i-2]);} int main(){ i原创 2013-07-17 11:11:22 · 694 阅读 · 0 评论 -
HDU-4633 poyla计数
题目连接具体分析见这个:点击打开链接解释下: 有polya定理:M= 1/G*∑m^c(ði) G 是置换群的个数。m代表染色数。c(ði)代表每个置换群ði循环节的个数 说明:i(1---->G)。根据此题:置换群G=24个。m=k个染色。c(ð1)=8+12+54=74*1, c(ð2)=(4+4+18)*2*4=26*8, c(ð3)=(2+3+原创 2013-08-08 09:39:14 · 1323 阅读 · 0 评论 -
HDU-4477滚动数组+递推(整数分解)
题目连接题意:给定绳子的长度,只可以把绳子剪成任意长度为整形的且彼此不相同,问有多小种不同剪的方案。比如 4=1+3。5=1+4. 5=2+3。6=1+2+3. 6=1+5. 6=4+2。分析:首先,我们可以发现,一个大于2的整数,可以分成一个最多的连续自然数相加,并且,一个大于2的整数至少可以分成2个不相同的整数相加,方案数为(n-1)/2。如果用a[i][j]表示第i个原创 2013-07-13 11:59:17 · 874 阅读 · 0 评论 -
HDU-4651 整数分解(生成函数)
题目连接题意:将数字n分解,求p(n)得个数。听说很多人都在看这个:点击打开链接我也不多说了:#include#define mod 1000000007__int64 f[100005];int w[100005];int main(){ int p=1,t,n; w[0]=0; for(int i=1;w[p-1]<=100000;i++){ w[p++]=原创 2013-08-07 10:25:27 · 799 阅读 · 0 评论 -
爬天梯-递归方程(类似整数分解)
题目连接题目分析:这题是一道常规题,看似把数分解,有多种可能,其实与走台阶是相通的,如果一个最多能跨过两个阶梯,那么要走完n个阶梯,有多种可能,高中这题是在计数原理里面的,非常简单,看看思路,你就非常明白了:推理:不管你中间怎样走,最后只有两种可能,要么最后一步只剩下一个台阶,要么剩下两个台阶。假设前面有f(n-1)和f(n-2)种。那么就有:原创 2013-05-19 19:15:22 · 1044 阅读 · 0 评论 -
HDU-1431素数回文
看到素数又想到了素数打表。但这题数据太大,恐怕还没输入就超时了。彻底不知道怎么办,看来discussion才知道最大素数回文。还有些人直接打表,简直是碉堡了!不过我以向不喜欢这样的死算法。好了废话小说,知道最大的回文素数(998899)这样就好办了,开个bool型数组还是过的去的,线性打素数表无压力了。代码:(220ms)#include#include #define M 9原创 2013-07-26 22:14:32 · 804 阅读 · 0 评论