数论
阿狸是狐狸啦
这个作者很懒,什么都没留下…
展开
-
逆元
求除法取模(a/b)%c要用到逆元即 (a/b)%c=a*(b关于模c的逆)%c逆元类似于实数运算中的倒数,因为乘法是可以直接取模的,所以我们可以将除法转换成乘法,用a乘b的倒数即a乘b的逆元然后去取模就可以了。逆元怎么求呢?(a和p互质,a才有关于p的逆元)1:根据费马小定理,我们可得出当p是素数时,对任意x,都有x^(p)≡ x(modp),若x无法被p整除,那么x^(p-1)≡ 1(mo...原创 2017-09-02 23:34:23 · 656 阅读 · 0 评论 -
LightOJ 1278
题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示;因此我们可以分解出sum的素奇数因子,奇数乘以奇数=奇数,然后求满足的k的个数即可。#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>using namespace ...原创 2018-03-06 23:14:00 · 274 阅读 · 0 评论 -
LightOJ-1095-math(错排)
题意:n个数1,2,3....n,问你前m个数中有只有k个数在原位上的方案数。题解:首先在前m个数选择k个,让着这k个数位置不变,然后前m个数的剩下m-k个数肯定要错排,而剩下的n-m个数可能错排也可能不错排,所以我们可以枚举后n-m个数没有参加错排的数个数[0,n-m],然后可推出公式ans=C(m,k)*singma(d[n-k-i]*c[n-m][i])#include <cstdio...原创 2018-02-27 21:02:13 · 205 阅读 · 0 评论 -
LightOJ - 1102 (组合数取模逆元,当n和m小于1e6,p为任意素数时,打表法)
题意:n分为k部分有多少种方法.题解:显然隔板法C(n+k-1,k-1)%mod,用到组合数逆元求法。#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostre...原创 2018-02-28 20:23:27 · 264 阅读 · 0 评论 -
LightOJ - 1117 (容斥原理)
题意:m个数,求1-n中不能被那m个数任意一个整除的数有多少个。题解:比较基础的容斥原理,状压一下即可。#include <string.h>#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;l...原创 2018-03-01 14:09:42 · 216 阅读 · 0 评论 -
卢卡斯定理模板(当n和m很大,p为素数时)
#include <string.h> #include <stdio.h> #include <iostream> #include <algorithm> typedef long long ll; using namespace std; ll quick_mod(ll a,ll b,ll m){ ll...原创 2018-03-01 14:56:28 · 270 阅读 · 0 评论 -
LightOJ - 1124 同codeforce-451E (隔板法,卢卡斯定理,当n和m很大,p为任意素数时)
题意:n个区间,每个区间可以取区间中的任意一个数,问取的数和为m的方案数。题解:先看codeforce上的451E的区间都是从0开始,所以我们先看code上的题。我们可以把m分为n份。那么利用隔板法,总的取法为C(n+m-1,n-1)。因为这样分的话,肯定有一些区间取的数多于那个区间的最大值,我们把这一部分减去就是我们要求的答案,怎么求多的那一部分呢,利用容斥原理,他超出的最小值为1,我们让sum...原创 2018-03-01 15:38:05 · 299 阅读 · 0 评论 -
快速判断一个数能否被 2 ,3 ,4 ,5, 7,9,11 整除
性质1:如果数a、b都能被c整除,那么它们的和(a+b)或差(a-b)也能被c整除。性质2:几个数相乘,如果其中有一个因数能被某一个数整除,那么它们的积也能被这个数整除。能被2整除的数:个位上的数能被2整除(偶数都能被2整除)能被3整除的数:各个数位上的数字和能被3整除能被4整除的数:个位和十位所组成的两位数能被4整除能被5整除的数:个位上的数都能被5整除(即个位为0或5)...转载 2018-03-10 12:02:19 · 6228 阅读 · 2 评论 -
LightOJ - 1035 (数论)
题意:分解n的阶乘。题解:因为n最大100,所以打一个100的素数表瞎搞它的素因子个数即可,注意输出格式,空格不多不少。#include <cstdio>#include <iostream>#include <string.h>#include <algorithm>using namespace std;typedef long lon...原创 2018-03-02 15:11:57 · 220 阅读 · 0 评论 -
LightOJ - 1045 求N!在k进制下的的位数(斯特林公式)
题意:求n的阶乘k进制下的位数。题解:斯特林公式可以求N!在k进制下的的位数。#include<cstdio> #include<iostream> #include<cmath> using namespace std; double pi =acos(-1.0);//πdouble e =exp(1);//e int t; ...原创 2018-03-02 15:21:21 · 245 阅读 · 0 评论 -
LightOJ - 1098 (求1到n的约数和)
题意:求1到n除了本身和1的约数和。题解:很容易想到O(n)的解法,对于每个数出现的次数为n/i,减去本身,那么求(n/i-1)*i,循环一遍即可。那么如何优化呢。我们可以先求出前sqrt(n)的数出现的次数,sqrt(n)之后的数出现的次数如何求呢,举个栗子。n=100,当我们求到7时,7一共出现了100/7次,减去本身出现的一次,ans+=(100/7-1)*7。而100/7>sqrt(...原创 2018-03-05 20:45:52 · 848 阅读 · 0 评论 -
LightOJ - 1163 (方程化简)
题意:给你一个B,已知A-A/10=B。让你求A。我们可以设A最后一位为x那么方程两边同时乘10,化为10*A-A+x=B。那么9A=B-x,x的范围是0到9,我们枚举x即可。#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>#include...原创 2018-03-05 21:20:19 · 205 阅读 · 0 评论 -
同余的基础性质
在开始之前,我们要先了解一些数论的基本符号(a,b)表示a,b的最大公约数,[a,b]表示a,b的最小公倍数,b|a表示a%b=0。在数论中我们定义同余:设m!=0,若m|a-b,则a-b=km。称m为模,a同余于b模m以及b是a模m的剩余。记做a≡b(modm),也称作模m的同余式。例如对于偶数我们总可以除尽2,那么用同余式就可写为a≡0(mod2),同理对于奇数我们可以写成a≡1(mod2)。...原创 2018-03-30 14:43:16 · 4878 阅读 · 0 评论 -
poj 1850 Code (组合数学)
题意:合法的字符串序列:由小写字母组成,每一个字符比后一个字符ASCII码要大将合法字符串序列按字典序编码,a编号为1,b编号为2,c编号为3.....ab编号为27以此类推,给定一个串,问你比他小的和法串有多少个,如果这个串不合法则输出0.题解:我们可以先求出长度比它小的串总数,若长度为i(i<n),我们需要在26个字母中选出i个即可。若i=n的话,我们可以假设前j-1个字母与原串相等,枚...原创 2018-03-26 21:41:34 · 102 阅读 · 0 评论 -
求数列......1,2,1,3,2,3,1,4,3,5,2,5,3,4,1...第n项
题意:求数列......1,2,1,3,2,3,1,4,3,5,2,5,3,4,1...第n项。题解:通过观察等数字1的下标,1,3,7,15我们发现都是2的幂次方-1,我们如果在把下标加1,那么发现a[2*n]=2*a[n].且a[2*n+1]=a[n]+a[n+1]。a[3]=2,a[2]=1,那么a[1]=1。于是数列就变成1,1,2,1,3,2,3,1,4,3,5,2,5,3,4,1......原创 2018-03-26 22:01:19 · 840 阅读 · 0 评论 -
POJ 1150 The Last Non-zero Digit
题意:求n!/(n-m)!的最后一位非零位。题解:直接求结果模10会超时,而且2和5的结果必然是0,所以先把n!中2和5的因子去掉。可以看出:1,2,3,4,5,6,7,8,9,10。。。除尽2和5之后为1,1,3,1,1,3,7,1,9,1。。。只剩下1,3,7,9的结尾的数。我们只需要统计一下以3,7,9结尾的数字个数即可。若干个3相乘结果的结尾是有规律的,可以简化计算。写两个函数统计以3,7...原创 2018-03-27 21:51:43 · 143 阅读 · 0 评论 -
LightOJ - 1067 (卢卡斯定理,打表法)
题意:求C(m,n)%p;题解:因为n (1 ≤ n ≤ 106), k (0 ≤ k ≤ n).T (≤ 2000)所以用到卢卡斯定理。#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include &l...原创 2018-02-27 11:38:05 · 205 阅读 · 0 评论 -
LightOJ - 1341 (因数分解)
题意:求区间[a,b]中b的因数对数有几个,[x,y]和[y,x]算一对。因为x和y的范围是1e12,那么我们根据唯一分解定理,只需要求1到1e6范围内的质因数即可。然后根据乘法原理:ans=ans*(质因数指数+1);最后ans除以2,就是b的所有因数对数。然后用ans减去,小于a的对数就是我们要求的答案。#include #include #include #includ原创 2018-01-30 11:31:58 · 282 阅读 · 0 评论 -
HPUOJ_1443_完美三元组
好难啊,完全没搞出来规律,唉,智商真是硬伤。看完答案后自己写了一些个人理解,如图,好久没写过字了。。。#include #include #include #include #include using namespace std;typedef long long ll;ll a[100005];void init(){ for(int i=1;i<=1000原创 2017-11-12 23:03:36 · 513 阅读 · 0 评论 -
hdu 4497 GCD and LCM
求满足gcd(x,y,z)=n,lcm(x,y,z)=m的不同三元组的个数。易得lcm(x,y,z)/gcd(x,y,z)=p1^a1*p2^a2*p3^a3*...pk^ak.(pi为素数)x/gcd=p1^b1*p2^b2*...*pk^(bk)y/gcd=p1^c1*p2^c2*...*pk^(ck)z/gcd=p1^d1*p2^d2*...*pk^(dk)由lcm及gc原创 2018-01-24 19:11:08 · 130 阅读 · 0 评论 -
UVA - 11426 GCD - Extreme (II) (欧拉函数)
题意:求f(x)前n项和 f(x)=SUM(gcd(i,j)) (1题解:设g(n,i):与n的gcd为i的数有多少个。那么最多可以有n/i个,这些数当中肯定有一些数与n的gcd是i的倍数。我们可以想到与n/i互质的数的个数肯定就是我们要求的数,比如:g(24,3),24可分解为3*3*3*3*3*3*3*3,3可分解为3,那么与8互质的数有1,3,5,7。那么这些数乘以三之后为3原创 2018-02-01 11:05:29 · 119 阅读 · 0 评论 -
LightOJ - 1282 (log取前3位)
题意:求n的k次方的前3位和后三位。后三位直接用快速幂取下模。前三位需要用到log维护,记得去年某个比赛就见到类似的用log保精度的问题,紫书上也遇到过,暑假的训练也碰到斐波那契前n位的问题,然后一直没看,最终区域赛热身赛也遇到这类问题,然后凉凉~~,今天又碰到了终于弄明白了QAQ。首先任意一个数字n都可以写成(10^a)(a为浮点数);那么(n^k)就可化为(n^(ak)),我们知道原创 2018-01-30 15:12:13 · 188 阅读 · 0 评论 -
LightOJ - 1245 (Harmonic Number (II)) 数论
题意:long long H( int n ) { long long res = 0; for( int i = 1; i <= n; i++ ) res = res + n / i; return res;}计算上面代码的值。题解:我们可以观察10这个数字他除以1,2,3,4,5,6,7,8,9,10之后分别为10,5,3,2,2,1,1,1,1...原创 2018-02-01 13:50:06 · 203 阅读 · 0 评论 -
LightOJ 1213 (Fantasy of a Summation )
#include int cases, caseno;int n, K, MOD;int A[1001];int main() { scanf("%d", &cases); while( cases-- ) { scanf("%d %d %d", &n, &K, &MOD); int i, i1, i2, i3原创 2018-02-01 18:04:58 · 171 阅读 · 0 评论 -
LightOJ - 1336 (Sigma Function)
题意:f(n)为n所有约数的和,给你一个数n,让你求从1到n中f(n)为偶数的数有多少个.思路:n=p1^e1*p2^e2...,则f(n)=(p1^(e1+1)-1)/(p1-1))*(p2^(e2+1)-1)/(p2-1))....且(p1^(e1+1)-1)/(p1-1))=p1^0+p1^1......+p1^e1;要使得f(n)为奇数,则(p1^(e1+1)-1)/(p1-1原创 2018-02-02 12:16:40 · 160 阅读 · 0 评论 -
LightOJ - 1078 (Integer Divisibility) (同余定理)
题意:给两个整数a,b;问你需要多少个b组成的数字,bbbbbbb....,可以整除a。同余定理(a*x+y)%b=((a%b)*(x%b)+(y%b))%b#include #include #include using namespace std;typedef long long ll;int main(){ int t,cas=1;scanf("%d",&t);原创 2018-02-02 14:50:55 · 203 阅读 · 0 评论 -
LightOJ - 1116 (唯一分解定理)
题意:给一个w,然后分为n*m形式,n为奇数,m为偶数,问你是否有解,如果有解,输出的答案m尽可能小。如果w是奇数肯定无解,因为偶数*奇数只能得到偶数。当w为偶数时,根据唯一分解定理,它的偶数质因子只有2,我们只要找到2的个数,然后全给m,剩下的全给n即可。#include #include #include using namespace std;typedef原创 2018-02-02 15:03:59 · 184 阅读 · 0 评论 -
POJ - 1061 青蛙的约会 (扩展欧几里得)
求解方程(m-n)*a+l*b=(y-x) 是否有解,如果有解求a大于0的最小解为多少。#include #include #include #include using namespace std;typedef long long ll;void gcd(ll a,ll b,ll &d,ll &x,ll &y){ if(!b) {d=a;x=1;y=0;} else原创 2018-01-29 17:09:35 · 137 阅读 · 0 评论 -
POJ - 2115 Looooops(扩展欧几里得)
求解Cx+pow(2,k)y=(B-A) 是否存在解,如果存在输出最小正整数解x类似于poj1061,直接用扩展欧几里得即可#include #include #include #include #include using namespace std;typedef long long ll;void gcd(ll a,ll b,ll &d,ll &x,ll &y){ i原创 2018-01-29 17:37:04 · 148 阅读 · 0 评论 -
【lightoj-1024】Eid (高精度)
题意:给n个数求它们的最小公倍数。 (2 ≤ n ≤ 1000),These integers will be between 1 and 10000.题解:数很大,需要用到高精度,根据唯一分解定理先把每个数分解成若干个质数相乘,因为数据范围是10000,所以不用再打一遍素数表,直接循环一遍即可,根据最小公倍数的性质,答案就是分解之后,i的最大次幂的积。#include <stdio.h&g...原创 2018-02-26 09:38:44 · 180 阅读 · 0 评论 -
LightOJ - 1319 (中国剩余定理,满足模数满足互质关系)
模板题注意用long long#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;ll Extended_Euclid(ll a,ll b,ll &x...原创 2018-02-26 10:35:58 · 191 阅读 · 0 评论 -
poj 2891(中国剩余定理,模数可能不互质)
【题意】给出k个模方程组:x mod ai = ri。求x的最小正值。如果不存在这样的x,那么输出-1.【题解】由于这道题目里面的ai、ri之间不满足两两互质的性质,所以不能用中国剩余定理直接求解,套模板。#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;typed...原创 2018-02-26 10:13:30 · 334 阅读 · 0 评论 -
(排列组合的重复问题)
将6个同学平均分成3组,问有几种分法。错解;C(2,6)*C(2,4)*C(2,2)=90, 为什么这样错了呢,因为我们没考虑重复的情况,假如分组情况如下1,2;3,4;5,6;先挑出1,2和后调出1,2没区别,所以产生了重复。正解:C(2,6)*C(2,4)*C(2,2)/3!=15一般情况下分为几组,结果就除以几的阶乘。...原创 2018-02-26 11:41:04 · 10143 阅读 · 0 评论 -
hdu1695 bzoj2301(莫比乌斯反演)
hdu1695 题意求:思路:看到gcd求和的式子基本都是莫比乌斯反演。那么我们对原式除以k,就变成,我们设f[k]=(gcd(i,j)=k),F[x]=(k|gcd(i,j)).那么我们求得ans=f[1]。易得F[k]=(n/i)*(m/k)利用莫比乌斯第二条公式反演得到所以#include <bits/stdc++.h>using names...原创 2019-03-14 15:28:26 · 160 阅读 · 0 评论