数论

[数论分块]BZOJ 1257 余数之和

不问归期 提交于 2019-11-27 14:46:59
Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值 其中k mod i表示k除以i的余数。 例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7 Input 输入仅一行,包含两个整数n, k。 1<=n ,k<=10^9 Output 输出仅一行,即j(n, k)。 Sample Input 5 3 Sample Output 7 分析 $\sum _{i=1}^n k\ mod\ i$ 易得$\sum _{i=1}^n k-\left \lfloor \frac{k}{i} \right \rfloor i$ $nk-\sum _{i=1}^n \left \lfloor \frac{k}{i} \right \rfloor i$ 由于求整除值有一段区间相同,整除分块即可 #include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef long long ll; ll n,k,ans; int main() { scanf("%lld%lld",&n,&k);ans=n*k; for (ll l

数论集合

你说的曾经没有我的故事 提交于 2019-11-27 13:57:25
零,前言: 学chty_sqy开个数论集合 学OI的时候以看数论就头大,现在该还了 T_T 建议推导和证明不熟或不会的同学动手推导 而且公式看上去不太清楚,学习的同学请仔细阅读 以前数论怎么都学不会,主要还是浮躁,不仔细看,没有动手 orz 一,gcd(欧几里得算法): 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b) => a=m*d,b=n*d 则m*d=t*n*d+a%b => a%b=d*(m-t*n) gcd(b, a%b)=gcd(n*d, (m-t*n)*d) 令gcd(n, m-t*n)=e => n=x*e,m-t*n=y*e 则m-x*e*n=y*e => m=e*(x*n+y) 由gcd(n, m)=1知gcd(e*(x*n+y), e*x)=1 故e=1 故gcd(n*d, (m-t*n)*d)=d即gcd(b, a%b)=gcd(a, b) 3.边界: 当b=0时return a 可以视为gcd(a, 0)=a,任何数都能整除0 也可以视为gcd(a, b)=b,这里的a和b是上一层的,满足a%b=0 4.特殊情况: 当a<b时,a%b=a,所以在下一层gcd(b, a%b)中相当于把a与b交换 5.代码: 1 int gcd(int a,int b){

数论函数 [模板]

≡放荡痞女 提交于 2019-11-27 13:00:23
质因数分解 重要数论函数 欧拉函数 求单个phi值: int Euler(int n) { LL k = (LL)sqrt(n + 0.5); LL ans = n; for(int i=2; i<=k; ++i){ if(n%i == 0){ ans = ans / i * (i-1); //ans -= ans/i; while(x%i == 0) n /= i; } } //最后只剩下 小于4的素数 或者n本身就是素数 if(n > 1) ans = ans / n * (n-1); // ans -= ans/i; return ans; } 欧拉筛 void euler(int n) { phi[1]=1; //1要特判 int cnt = 0; for (int i=2;i<=n;i++){ if (flag[i]==0){ //这代表i是质数 prime[++cnt]=i; phi[i]=i-1; } for (int j=1;j<=cnt&&prime[j]*i<=n;j++){ flag[i*prime[j]]=1; //先把这个合数标记掉 if (i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; //若prime[j]是i的质因子,则根据计算公式,i已经包括i*prime[j]的所有质因子 break; /

数论——定理整理

与世无争的帅哥 提交于 2019-11-27 12:25:00
欧拉定理: 若正整数 a , n 互质,则 a φ(n) ≡1(mod n) 其中 φ(n) 是欧拉函数(1~n) 与 n 互质的数。 费马小定理:   对于质数p,任意整数a,均满足: a p ≡a(mod p) 欧拉定理的推论: 若正整数a,n互质,那么对于任意正整数b,有 a b ≡a b mod φ(n) (mod n) 来源: https://www.cnblogs.com/Msmw/p/11362928.html

UPC4247【数论】普通递归关系

妖精的绣舞 提交于 2019-11-27 10:47:17
【数论】普通递归关系 时间限制: 1 Sec 内存限制: 128 MB 提交: 103 解决: 19 [ 提交 ] [ 状态 ] [命题人: admin ] 题目描述 考虑以下定义在非负整数 n 上的递归关系 其中 a,b 是满足以下两个条件的常数: (1) a2+4b>0 (2) |a-sqrt(a2+4b)| <= 2 // sqrt 是根号的意思 给定 f0,f1, a, b 和 n,请你写一个程序计算f(n),可以假定f(n)是绝对值不超过 109 的整数 (四舍五入)。 输入 一行依次给出5个数,f0,f1,a,b和n,f0,f1是绝对值不超过109,n是非负整数,不超过109。另外,a、b是满足上述条件的实数,且|a|,|b|<=106。 输出 一个数F(n) 样例输入 复制样例数据 0 1 1 1 20 样例输出 6765一道水题,矩阵快速幂板子题,注意是duoble类型,而且注意神坑数据f1=f0=0 #include <bits/stdc++.h> typedef long long ll; using namespace std; const int N=1e6+5; struct mat { double a[2][2]; mat operator *(const mat &t)const { mat res; for(int i=0;i<2;i++) {

「证明」联赛数论相关证明(持续更新,想看什么评论即可)

二次信任 提交于 2019-11-27 08:14:21
欧几里德相关: 1.裴蜀定理: 一个二元线性方程:$ax+by=c$,存在解的充分必要条件为:$gcd(a,b)|c$ 证明:  令$d=gcd(a,b)$   $a=k_1d$   $b=k_2d$   $ax+by=(k_1+k_2)d=c$ 所以$d|c->gcd(a,b)|c$    来源: https://www.cnblogs.com/Lrefrain/p/11353765.html

数论——HDU - 2136

爷,独闯天下 提交于 2019-11-27 07:58:05
题目链接 题目含义 找出一个数最大素数因子的序号 题目分析 我们可以在筛素数的同时,用这个素数标记它的倍数,说明这些倍数一定有它这个素数因子 这样筛一遍下来,一个数大的素数因子就会覆盖它小的素数因子 题目代码 #include<iostream> #include<stdio.h> #include<string.h> #include<vector> using namespace std; typedef long long LL; const int maxn=1000007; int prime[maxn],num[maxn]; bool check[maxn]; int cnt=0; void Prime(){ num[1]=0; for(int i=2;i<maxn;i++) if(!check[i]){ prime[cnt++]=i; for(int j=1;j*i<maxn;j++){ check[j*i]=true; num[j*i]=cnt; } } } int main(){ Prime(); int n; while(~scanf("%d",&n)){ printf("%d\n",num[n]); } return 0; } 来源: https://www.cnblogs.com/helman/p/11352527.html