数论
宝宝睡醒了
这个作者很懒,什么都没留下…
展开
-
线性筛
线性筛#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <vector>//#include <tr1/unordered_map>/原创 2020-09-05 21:24:31 · 134 阅读 · 0 评论 -
数论
数论快速幂求逆元b * x ≡ 1(mod p)根据费马定理:b^(p - 1) ≡ 1(mod p)(其中b和p互质)可以推出 b * b ^ (p - 2) ≡ 1(mod p)所以 x = b ^ (p - 2)所以可以用快速幂来实现。扩展欧几里得算法ax + by = c,如果c能够整除gcd(a, b),那么此方程有解,否则无解。#include <iostream>#include <vector>using namespace std;cons原创 2021-01-20 17:27:49 · 97 阅读 · 0 评论 -
Gym - 101341D 裴蜀定理
Gym - 101341D 裴蜀定理裴蜀定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍。#include <iostream>using namespace std;typedef long long LL;LL gcd(LL a, LL b){ return b==0?a:gcd(b, a%b);}int n;LL x, ans, k;int main(){ cin >> n >> k;原创 2021-01-20 00:30:03 · 101 阅读 · 0 评论 -
容斥原理
容斥原理题目:给出一个数n,给出m个质数,问1~n中有多少个数是这m个质数的倍数。#include <bits/stdc++.h>using namespace std;typedef unsigned long long ULL;const int N = 110;int n, m;int p[N];int main(){ cin >> n >> m; for(int i = 0; i < m; i ++) cin >&g原创 2021-01-19 17:43:50 · 73 阅读 · 0 评论 -
调和级数
数论调和级数公式:f(n)=ln(n)+C+1/(2*n)当n < 10000时,直接算,大于10000时用公式,其中C≈0.57721566490153286060651209c++中,log就是ln例题#include<bits/stdc++.h>using namespace std;const double r = 0.57721566490153286060651209;double a[10000];int main() { a[1] = 1;原创 2020-11-30 21:37:39 · 1779 阅读 · 0 评论 -
整数分块
数论整数分块整数分块用于快速处理,形如:通过推理可以发现,假设它的起始下标是l,那么它的结束下标为r = n / (n / l)。例如当n = 5时,sum = 5 + 2 + 1 + 1 + 1;需要注意的是除以0的时候。例题#include <cstdio>typedef long long ll;ll solve() { ll n, ans = 0; scanf("%lld", &n); for (ll l = 1, r; l <=原创 2020-11-30 21:21:13 · 261 阅读 · 0 评论 -
L1-050 倒数第N个字符串 (15分)
L1-050 倒数第N个字符串 (15分)思路:就是先算出k位字母的所有组合数,然后减去n,在转换为26进制的字符串表示。代码:#include <bits/stdc++.h>using namespace std;int main() { int L, N; int index[10] = {0}; char c; int count = 0; cin >> L >> N; int res = pow(26,原创 2020-11-21 19:34:24 · 70 阅读 · 0 评论 -
PTA-L1-006 连续因子 (20分)
PTA-L1-006 连续因子 (20分)一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。输入格式:输入在一行中给出一个正整数 N(1<N<231)。输出格式:首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。原创 2020-11-20 20:32:47 · 409 阅读 · 0 评论 -
几何知识
两点距离公式:d=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2));中点坐标公式:x=(x1+x2)/2 y=(y1+y2)/2 ;直线斜率:k=(y2-y1)/(x2-x1);多边形面积和叉乘三角形面积算法:(1)底×高/2;(2)海伦公式:p = (a + b + c) / 2;S = sqrt(p * (p - a) * (p - b) * (p - c));(3)向量法:1 / 2 * a 叉乘 b;叉乘:平面上的两点的直角坐标分别为p1(x1,原创 2020-11-10 21:35:27 · 119 阅读 · 0 评论 -
快速幂(数论)
快速幂#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e6 + 10;#define ll long long#define N 1000010const int mod = 1e9 + 7;//快速幂int qmi(int a, int k, int p) { int res = 1; while (k) { if (k &原创 2020-10-27 12:00:37 · 142 阅读 · 0 评论 -
欧拉函数
欧拉函数欧拉函数作用对于一个正整数n,求小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。其中pi是n的质因数,n是不为0的整数,φ(1) = 1。代码#include <bits/stdc++.h>using namespace std;//#include <stdio.h>//#include <stdlib.h>//#include <string.h>#define ll long long#define N 1000原创 2020-10-26 21:10:01 · 114 阅读 · 1 评论 -
Pairs Forming LCM
题目大意:找最小公倍数为n的(i, j)的对数。多组输入T <= 200, 1 <= n <= 1e14;解题思路:先用素数筛,筛出所有素数。然后根据质因数分解定理,找规律找出对数。规律:首先了解质因数分解定理,然后如果ai = ei时,bi的范围是[0, ei],可取个数为ei + 1;bi同理。但当ai = bi = ei时会重复算一次,所以最后 ans *= (2 * ei + 1);然后除了lcm(n, n) = n 以外,所有情况都出现了两次,所以最后ans = (an原创 2020-10-26 20:27:23 · 96 阅读 · 0 评论 -
唯一分解定理(数论)
数论唯一分解定理(1)一个大于1的正整数N, 如果它的标准分解式为:那么它的正因数个数为:(2)它的全体正因数之和为:Aladdin and the Flying Carpet给一对数字 a,b ,a是一个长方形的面积,问有多少种整数的边的组合可以组成面积为a的长方形,要求最短的边不得小于bInputInput starts with an integer T (≤ 4000), denoting the number of test cases.Each case starts wit原创 2020-10-23 20:44:12 · 224 阅读 · 0 评论 -
最大公约数和最小公倍数
gcd正常做法int gcd(int a,int b) { int r; while(b > 0) { r = a % b; a = b; b = r; } return a;}三目运算int gcd(int a,int b) { return b > 0 ? gcd(b, a % b) : a ;}库函数int gcd(int a,int b) { return __gcd(a, b)原创 2020-10-14 20:02:17 · 78 阅读 · 0 评论