数论基础
zhuxiyulu
这个作者很懒,什么都没留下…
展开
-
HDU6185 Covering(矩阵快速幂)
/* 递推公式+矩阵快速幂 a(n)=a(n-1)+5*a(n-2)+a(n-3)-a(n-4) */ #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int m原创 2017-10-12 20:15:53 · 252 阅读 · 0 评论 -
POJ - 2478 Farey Sequence (欧拉函数)
#include<cstdio> using namespace std; /* 欧拉函数n>=2 a/b(a<=a<b<=n&&gcd(a,b)==1) F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5} 求Fn集合中元素原创 2017-07-29 11:28:39 · 188 阅读 · 0 评论 -
HDU 6050 Funny Function(矩阵)
#include<cstdio> #include<cstring> #include<iostream> const int mod=1e9+7; using namespace std; typedef long long LL; LL n,m;struct Matrix { LL mat[2][2]; Matrix operator -(Matrix &tmp) {原创 2017-07-28 21:04:39 · 304 阅读 · 0 评论 -
CSU1803 2016(同余)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; /* 同余 题意:求满足a * b 是 2016的倍数的对数, 1<= a <=n, 1<= b <=m; a[i]表示0-n之间的每个数对2016取余,余数为i的个数 (a*b)%2016==(a%原创 2017-08-20 15:31:34 · 227 阅读 · 0 评论 -
HDU6112 今夕何夕(星期)
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; /* 接下来最近的哪一年里的同一个日子,和今天的星期数一样? 比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。 在公历中,能被4整除但不能被100原创 2017-08-13 10:50:36 · 388 阅读 · 0 评论 -
HDU6108 小C的倍数问题(进制+唯一分解定理)
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn=1e6+5; /* 唯一分解定理现在给定进制P,求有多少个B满足P进制下, 一个正整数是B的倍数的充分必要条件是每一位加起来的和是B的倍数。原创 2017-08-13 10:44:30 · 229 阅读 · 0 评论 -
HDU6154 CaoHaha's staff(递推+网格)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int maxn=1e6+5; /* 递推+网格题意:在笛卡尔坐标系下,画一个面积至少为n的简单多边形, 每次只能画一条边或者一个格子的对角线,问至原创 2017-08-19 21:25:52 · 326 阅读 · 0 评论 -
HDU6129 Just do it(前缀异或+杨辉三角)
/* 前缀异或+杨辉三角 给定一个数组,求m次前缀和异或的结果 Lucas定理,C(a,b)是奇数当且仅当把a,b二进制表达后b中1的位置是a中1的位置的子集 如果对于两个数n、m,如果(n&m)==m,那么C(n,m)为奇数,否则为偶数。考虑第一个数对后面的贡献次数 第一次: 1 0 0 0 0 第二次: 1 1 1 1 1 第三次: 1 2 3 4 5 第四次: 1 3 6 10 15 第原创 2017-08-18 21:39:09 · 376 阅读 · 0 评论 -
HDU6069 Counting Divisors(区间素数筛)
#include<cstdio> #include<cstring> #include<iostream> using namespace std; /* 区间素数筛法 求区间[l^k,r^k]每个数质因数个数的和,mod 998244353 (1<=l<=r<=1e12,r-l<=1e6,1<=k<=1e7) */ typedef long long LL;const int maxn=1e6+5原创 2017-08-04 15:28:04 · 232 阅读 · 0 评论 -
51nod 1135 原根
#include <cstdio> #include <cstring> #include <iostream> using namespace std; /* 求一个素数最小的原根 */ typedef long long LL; const int maxn=1e5+5; int p; int prime[maxn]; bool is_prime[maxn]; //素数筛 void sieve(原创 2017-08-04 14:37:46 · 264 阅读 · 0 评论 -
51nod1130 N的阶乘的长度 V2(斯特林近似)
#include <cstdio> #include <cmath> #include <iostream> using namespace std; typedef long long LL; /* 斯特林公式 求n!十进制表示是多少位数 n!~sqrt(2*PI*n)*((n/e)^n) */ const double PI=acos(-1.0); int n;int main() {原创 2017-08-06 21:46:09 · 192 阅读 · 0 评论 -
HDU6114 Chess(组合数)
/* 组合数在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数 对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A), 那么車A必须在車B的右边(車A列号大于車B)。ans=C(max(m,n),min(m,n)) */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring>原创 2017-08-14 15:15:07 · 276 阅读 · 0 评论 -
51nod1242 斐波那契数列的第N项(矩阵)
#include<cstdio> #include<cstring> #include<iostream> const int mod=1e9+9; using namespace std; typedef long long LL; LL n;struct Matrix { LL mat[2][2]; Matrix operator -(Matrix &tmp) {原创 2017-08-14 20:28:36 · 203 阅读 · 0 评论 -
codeforces 869B The Eternal Immortality
/* 阶乘 求a!/b!的个位数字 */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; LL a,b;int main() { while(~scanf("%I64d%I64d",&a,&b)) { LL ans=原创 2017-10-11 19:15:02 · 195 阅读 · 0 评论 -
Codeforeces868C Qualification Rounds(位运算)
/* 位运算 有n个备选题,k个队伍,1代表该队伍知道这个题目,0代表不知道 是否可以选出几个题使每个队伍都知道题目总数的一半 如果选多个题可以满足要求,那么其中至少有2个题可以满足要求 由于k比较小,可以处理处最大的可能x,进行枚举 */ #include <cstdio> #include <algorithm> #include <cstring> #include <set> using n原创 2017-10-09 21:23:13 · 185 阅读 · 0 评论 -
Codeforces851D Arpa and a list of numbers(素数筛)
/* 素数筛 有n个数,可以进行两种操作: 1,删除一个数,花费x 2,某个数的值+1,花费y 现在想让序列所有数的gcd>1,求最小花费。(全部删除也合法) 枚举数列中所有的素数i,如果某个数a[j]不是i的倍数, 将其删除花费为v1=x,增加到是i倍数花费为v2=(i-a[j]%i)*y; (n-cnt)*x删除所有数,(n-cnt)*y,所有数+1 */ #include <iostream>原创 2017-09-07 21:53:48 · 199 阅读 · 0 评论 -
LightOJ - 1213 Fantasy of a Summation (快速幂)
#include<cstdio> #include<cstring> using namespace std; /* 快速幂 有k层,每层加n个数,总的累加次数为n^k 每次累加,从n个数中选取k个数k/n 对答案贡献为n^k*(k/n)=(n^(k-1))*k(sum(a[i])*(n^(k-1))*k)%mod */ typedef long long ll; int n,mod; ll k,a原创 2017-07-22 17:18:45 · 288 阅读 · 0 评论 -
51nod1073 约瑟夫环
/* 约瑟夫环 f(0)=0; f(i)=(f(i-1)+k)%i */ #include <iostream> #include <cstdio> #include <cstring> using namespace std;int main() { int n,k; while(~scanf("%d%d",&n,&k)) { int ans=0;原创 2017-08-27 14:11:06 · 261 阅读 · 0 评论 -
51nod1256 乘法逆元
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> using namespace std; typedef long long LL;/* 扩展欧几里得法(求ax + by = gcd) 且|x|+|y|最小。其中d=gcd(a,b) */ LL gcd(LL a,LL b,LL &d,LL &x,LL原创 2017-08-27 10:09:24 · 225 阅读 · 0 评论 -
HDU6156 Palindrome Function(回文数)
#include <iostream> #include <cstdio> #include <algorithm>using namespace std; /* k进制下的回文数如果n在k进制下是回文数f(n,k)=k,否则f(n,k)=1 n和k的变化范围为L<=n<=R,l<=k<=r,计算f(n,k)的累加和对于一个数,比如k进制下,从高位到地位表示为,456123 k[]=321654、x原创 2017-08-25 11:29:47 · 281 阅读 · 0 评论 -
HDU6168 Numbers
/* map+模拟 有n个数a[i],对于每对(i,j),1<=i<=j<=n,计算(a[i]+a[j]) 得到新的数列b[i],有m个数,m=n*(n+1)/2 现已知b[i],求a[i] */#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> using name原创 2017-08-25 17:27:14 · 185 阅读 · 0 评论 -
HDU6053 TrickGCD(莫比乌斯函数)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; /* 给定数列A,求解数列B有多少种 数列B满足 1<=Bi<=Ai,且对于任意区间[l,r],gcd(Bl,Bl+1,...Br)>=2 */ typedef long long LL; const int maxn=1e5+5; const in原创 2017-08-14 21:42:33 · 217 阅读 · 0 评论 -
51nod1181 质数中的质数(质数筛法)
/* 素数筛如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。 如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。 。现在给出一个数N,求>=N的最小的质数中的质数是多少 */#include <iostream> #include <cstdio> #include <cstdio> #include <algorithm> using namespace std;co原创 2017-08-14 20:53:43 · 221 阅读 · 0 评论 -
UVA - 10200 Prime Time (素数判断)
#include<cstdio> #include<cmath> using namespace std; const int maxn=1e4+5; const double esp=1e-8; int sum[maxn]; /* a<=n<=b, m=n*n+n+41 在区间[a,b] m为素数概率的多大 */ //素数判断 bool is_prime(int n) { int m=sq原创 2017-07-27 10:42:29 · 186 阅读 · 0 评论 -
UVA - 11827 Maximum GCD (gcd+ungetc()函数)
#include<cstdio> using namespace std; const int maxn=100+5; int num[maxn]; /* 给定一些数,求两两最大公约数的最大值 没有说明一行有多少个数,注意输入格式 用ungetc()函数处理输入 */ int gcd(int a,int b) { return (a%b==0)?b:gcd(b,a%b); }int main原创 2017-07-26 21:35:26 · 249 阅读 · 0 评论 -
HDU 6043 KazaQ's Socks(周期)
#include<cstdio> using namespace std; typedef long long LL; /* 周期 一共n双袜子编号1~n,每天早上选取编号最小的一双穿 当晚上发现只剩一双袜子能穿时,把之前的袜子都洗了 第二天晚上就可以穿。问第k天穿的是编号多少的袜子 规律:[1.2....n] [1.2....n-1] [1.2...n-2.n] [1.2....n-1] [1.原创 2017-07-26 17:45:17 · 201 阅读 · 0 评论 -
LightOJ - 1341 Aladdin and the Flying Carpet(唯一分解定理)
#include<cstdio> using namespace std; typedef long long LL; /* 唯一分解定理的运用 一个数可以唯一分解为n=p1^s1+p2^s2+……pk^sk n的正因数的个数可以表示为: num = (s1+1)*(s2+1)…(sk+1);(+1是因为可以不选这个质因数)题中是求a=m*b (m,b)的对数且要求m>=b,因此将num/2避免重复原创 2017-07-21 15:05:21 · 227 阅读 · 0 评论 -
LightOJ - 1236 Pairs Forming LCM(唯一分解定理)
#include<cstdio> #include<cstring> using namespace std; typedef long long LL; /* 唯一分解定理的运用 有多少组(i,j)(i<=j<=n)使得lcm(i,j)=n (1<=n<=e^14)i=p1^a1 * p2^a2 *……* pk^ak j=p1^b1 * p2^b2 *……* pk^bk gcd(i,j)=p1原创 2017-07-22 11:18:04 · 239 阅读 · 0 评论 -
LightOJ - 1245 Harmonic Number (II)
#include<cstdio> #include<cmath> using namespace std; typedef long long ll; /* 求解 n/1+n/2+n/3+……n/n; 例如 if(n==10) ans=10+5+3+2+2+1+1+1+1+1 i=1 n/1=10 后面5个1的和 (n/1-n/2)*1 i=2 n/2=5 后面2个2的值 (n/2-n原创 2017-07-22 09:54:51 · 239 阅读 · 0 评论 -
LightOJ - 1259 Goldbach`s Conjecture (素数筛)
#include<cstdio> using namespace std; /* 给一个偶数n,求有多少对素数为n[4,e^7] a<=b n=a+b a和b为素数 */ const int maxn=1e6+5; const int maxm=1e7+5; int p; int prime[maxn]; bool is_prime[maxm]; //素数筛 void sieve(int n) {原创 2017-07-21 21:20:23 · 313 阅读 · 0 评论 -
LightOJ - 1282 Leading and Trailing
#include<cstdio> #include<cmath> using namespace std; typedef long long LL; /* 求解n^k的前三位数与末三位数 */ const LL INF=1e9; //快速幂运算 LL mod_pow(LL x,LL n,LL mod) { LL res=1; while(n>0) { if(原创 2017-07-21 20:08:28 · 192 阅读 · 0 评论 -
LightOJ - 1336 Sigma Function (整数拆分推论)
题意:1~n (1 ≤ n ≤ e^12)中,因子和为偶数的有几个。 #include<cstdio> #include<cmath> using namespace std; typedef long long LL; LL n; /* 在[1,n]中平方数或者是两倍的平方数的因子和为奇数 (满足2的更高次幂也一定是2的倍数,不用重复计算) 其中平方数有sqrt(n)个,两倍的平方数有sqrt(原创 2017-07-21 16:32:02 · 198 阅读 · 0 评论 -
LightOJ - 1356 Prime Independence(质因数分解+二分图的最大匹配)
LightOJ - 1356 Prime Independence匈牙利算法#include<cstdio> #include<cstring> #include<cmath> #include<vector> using namespace std; /* 求二分图的最大独立集 邻接表存图 匈牙利算法得到最大匹配(或最小顶点覆盖)hungary() V-hungary()=最大独立集 */ con原创 2017-07-21 11:00:19 · 306 阅读 · 0 评论 -
高斯消元矩阵的逆+行列式的值
#include<cstdio> #include<algorithm> using namespace std; typedef long long LL; #define Mod 1000000007 const int maxn=200+5; int n;//n阶方阵 LL A[maxn][maxn],Inv[maxn][maxn];//A为已知n阶方阵,Inv为矩阵A^(-1) LL det原创 2017-07-21 10:55:34 · 883 阅读 · 0 评论 -
UVA - 11752 The Super Powers
#include<cstdio> #include<cmath> #include<set> using namespace std; /* 输入1-(2^64-1) 之间的超级幂,(即,一个数至少可以分解为两个数的幂) 枚举底数,其幂不超过ceil(64 * log(2) / log(i)) - 1,且幂必须为合数 */ typedef unsigned long long LL; const i原创 2017-07-29 16:01:19 · 179 阅读 · 0 评论 -
HDU1398(生成函数)
有1,4,9,16,25…..2^17这17种面值的硬币,问任意给定一个不大于300的正整数面额,用这些硬币来组成此面额总共有多少种组合种数。#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxv=25; const int maxn=300+5; int v[maxv];原创 2017-07-13 18:18:54 · 269 阅读 · 0 评论 -
LightOJ - 1234 Harmonic Number (调和级数)
按步长预处理#include<cstdio> using namespace std; /* 计算H(n)=1/1+1/2+1/3+……1/n (1<=n<=e8) 如果存储所有调和级数的值,存储不下 设定一个步长stept,每100存储一个Hn */ const int INF=1e8+5;//最大值 const int maxn=1e6+5; const int stept=100;//步长 d原创 2017-07-22 15:24:50 · 365 阅读 · 0 评论 -
LightOJ - 1214 Large Division (同余模定理)
#include<cstdio> #include<cstring> using namespace std; /* 同余模定理 判断a%b==0 (-e^200<=a<=e^200 -2^31<=b<=2^31)*/ typedef long long ll; const int maxn=200+5; char a[maxn]; ll b; //(-2^31<=b<=2^31)int mai原创 2017-07-22 16:38:01 · 226 阅读 · 0 评论 -
LightOJ - 1197 Help Hanzo (区间素数筛)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; /* 区间素数筛 求区间[a,b] 素数个数,1<=a<=b<2^31 b - a ≤ 100000*/ typedef long long ll; const int maxn=1e6+5; int prime[maxn];//素数 bool i原创 2017-07-22 21:26:17 · 266 阅读 · 0 评论 -
HDU 6033 Add More Zero(取对数)
#include<cstdio> #include<cmath> using namespace std; /* 2^m=10^n 给定m,求n 两边取对数 n=m*log10(2) */ int main() { int m; int kase=1; while(~scanf("%d",&m)) { int n=m*log10(2);原创 2017-07-26 14:47:12 · 201 阅读 · 0 评论