数论
Pandauncle
写给自己的。
学好自己该学的,
什么都想学的,什么都学不好。
什么都不学的,神马都是浮云。
不要好高骛远。
脚踏实地,
想要的会来的。
展开
-
欧几里得二进制优化
首先,欧几里得又叫辗转相除法,gcd(a,b)=gcd(b,a%b)。证明略。int gcd(int x,int y){ return y==0?x:gcd(y,x%y);}如果想进一步提高GCD的效率,可以通过不断去除因子2来降低常数。 若x=y,则GCD(x,y)=x,否则: (1)若x,y均为偶数,则GCD(x,y)=2*GCD(x/2,y/2); (2)若x为偶数,y为奇数原创 2018-02-02 20:29:12 · 692 阅读 · 0 评论 -
BZOJ1013: [JSOI2008]球形空间产生器sphere
1013: [JSOI2008]球形空间产生器sphereTime Limit: 1 Sec Memory Limit: 162 MB Submit: 6875 Solved: 3617 [Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球 面上n+1个点...原创 2018-06-09 15:20:28 · 191 阅读 · 0 评论 -
数列分块入门 4
题目链接 此题和前面的没有什么区别,只需要去维护整块内的和就行,不知整块的去暴力加和。#include<stdio.h>#include<iostream>#include<queue>#include<algorithm>#include<cmath>#include<string.h>#include...原创 2018-06-16 19:02:40 · 269 阅读 · 0 评论 -
数列分块入门 5
数据最大范围是2^31,所以最多开5次方就会话成&lt;=1的数。用一个数组进行标记块内的元素是不是全部都小于等于1。#include&lt;stdio.h&gt;#include&lt;cmath&gt;#include&lt;set&gt;#include&lt;vector&gt;#include&lt;algorithm&am原创 2018-06-16 20:57:26 · 325 阅读 · 0 评论 -
数列分块入门6
题目链接 当单块过大时,进行重新建块#include&lt;stdio.h&gt;#include&lt;set&gt;#include&lt;vector&gt;#include&lt;algorithm&gt;#include&lt;queue&gt;#include&lt;iostream&gt;原创 2018-06-18 18:51:21 · 326 阅读 · 0 评论 -
数列分块入门 7
新技能:乘法标记 题目链接#include<map>#include<set>#include<cmath>#include<stack>#include<queue>#include<cstdio>#include<vector>#include<cstring>原创 2018-06-18 21:05:13 · 379 阅读 · 0 评论 -
数列分块入门 8
题目链接 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c。 我们用一个标记记录这个块中的元素是不是都一样,一样的话进行标记,修改时在该块中的直接修改标记就好了,不在该块内的进行暴力更改。#include<set>#include<map>#include<algorithm>#include...原创 2018-06-19 19:44:43 · 661 阅读 · 1 评论 -
HDU6395Sequence(矩阵快速幂+分块)
思路: 这道题的范围很大所以没法使用直接跑循环地推的方法求第n项,很容易就能分析出应该转化成矩阵的方法,然后使用矩阵快速密来求解第n项的值。 题目给的递推式是一个非线性的关系,所以不能直接构造出一个矩阵。当⌊P/n⌋在某一块内为确定的常数时,我们就可以构造出矩阵,进行矩阵快速幂。而某一段内的最大个数为:j=n/(n/i),j是满足n/t=i最大的t。 构造的矩阵为: #includ...原创 2018-08-14 21:27:07 · 245 阅读 · 0 评论 -
HDU6434Problem I. Count
聚聚写的很好 至于为什么i为奇数时欧拉函数要除以2,因为a只能为奇数,偶数占了一半。#include<bits/stdc++.h>using namespace std;typedef long long int ll;const int N=20000000+10;ll phi[N],prime[N];bool vis[N];ll sum[N];void get_...原创 2018-08-30 21:27:22 · 280 阅读 · 0 评论 -
BZOJ2956: 模积和(分块大法好)
推完公式分块即可。#include<cstdio>#include<algorithm>#include<cmath>#include<set>#include<map>#include<vector>#define inf 1000000000#define mod 19940417#define...原创 2018-09-03 19:34:34 · 248 阅读 · 0 评论 -
D. Notepad
题意:求(b-1)b^(n-1)%mod 2<=b<=10(106),1<=n<=10(106),1<=c<=10^9;//(b-1)*b^(n-1)%mod//2<=b<=10^(10^6),1<=n<=10^(10^6),1<=c<=10^9;#include<bits/stdc++.h>原创 2018-09-25 19:42:50 · 203 阅读 · 0 评论 -
牛客网wannafly因子
质因数分解+阶乘质因数分解,取p质因数分解的指数和阶乘质因数分解指数比值的最小值即可。#include<bits/stdc++.h>using namespace std;typedef long long int ll;#define int long long intconst ll N=100000+10;const int INF=(1LL<<63)-1...原创 2018-09-30 21:27:48 · 234 阅读 · 0 评论 -
数论之神
打表找规律。对于每个n当i>=sqrt(n)时可以分为根号n块,小于n的,每个独立为一块。#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ int T; scanf("%d",&T); ll n,k; while(T--) ...原创 2018-10-08 19:32:45 · 297 阅读 · 0 评论 -
2014ACM/ICPC亚洲区西安站 F题 color(容斥原理)
题目链接题意:n朵花排成一行,我们有m种颜色,可以给这些花涂色,保证相邻的花的颜色不同问,最后恰好使用了k种颜色的方案数。Orz博主题解//(m,k)*sigma((-1)^(k-i)*(k,i)*i*(i-1)^(n-1))#include<bits/stdc++.h>using namespace std;typedef long long int ll;con...原创 2018-10-15 21:48:13 · 412 阅读 · 0 评论 -
数列分块入门 3
题目链接 根据数列分块入门2的思想做。可能用其他的STL比较方便,我这里还是用的vector。#include&lt;stdio.h&gt;#include&lt;iostream&gt;#include&lt;algorithm&gt;#include&lt;queue&gt;#include&lt;cmath&gt;#incl原创 2018-06-16 15:27:16 · 434 阅读 · 1 评论 -
数列分块入门2
题目链接 给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,询问区间内小于某个值 xxx 的元素个数。 根据数列分块入门1的思想,把n个数分为根号n块,不完整块的去暴力求和和查找,完整块用加法标进行标记,查找排序后进行二分查找。#include<stdio.h>#include<algorithm>#include<iostream>...原创 2018-06-15 19:50:51 · 870 阅读 · 2 评论 -
HDU5969最大的位或
Problem Description B君和G君聊天的时候想到了如下的问题。 给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。 其中|表示按位或,即C、 C++、 Java中的|运算。Input 包含至多10001组测试数据。 第一行有一个正整数,表示数据的组数。 接下来每一行表示一组数据,包含两个整数l,r。 保...原创 2018-06-08 18:56:45 · 198 阅读 · 0 评论 -
扩展欧几里得
扩展欧几里得算法是用来再已知(a,b)时,求解一组整数解使得a*x+b*y=gcd(a,b)。 根据数论解一定存在(gcd(a,b)|gcd(a,b))。 首先: 当b=0时,gcd(a,b)=a,x=1,y=0。 根据欧几里得gcd(a,b)=gcd(b,a%b)。 所以gcd(a,b)=a*x+b*y。gcd(b,a%b)=b*x+a%b*y。 a%b=a-[a/b]*b ([x]为原创 2018-02-03 15:22:32 · 372 阅读 · 0 评论 -
扩展欧几里得求解线性同余方程
求解ax+by=c之前首先要知道一个定理。 定理1:对于方程a*x+b*y=c,该方程等价于a*x≡c(mod b),有整数解的充分必要条件是: c%GCD(a,b)=0。 根据定理1,对于方程a*x+b*y=c,我们可以先用扩展欧几里得算法求出一组x0,y0,也就是a*x0+b*y0=GCD(a,b),然后两边同时除以GCD(a,b),再乘以c。这样就得到方程a*x0*c/GCD(a,b)+原创 2018-02-03 21:00:29 · 667 阅读 · 0 评论 -
青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 122543 Accepted: 26028 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事原创 2018-02-04 10:52:34 · 215 阅读 · 0 评论 -
Sumdiv
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 24296 Accepted: 6022 DescriptionConsider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. D原创 2018-02-04 20:15:17 · 379 阅读 · 0 评论 -
Biorhythms
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 141712 Accepted: 45545 DescriptionSome people believe that there are three cycles in a person’s life that start the d原创 2018-02-05 14:01:45 · 420 阅读 · 0 评论 -
欧拉函数的线性筛法
欧拉函数:对正整数n,欧拉函数是小于等于n的数中与n互质的数的数目。 欧拉函数又称为φ函数。 下面是欧拉函数的一些性质: 如果n为某一个素数p,则φ(p)=p-1; 如果n为某一个素数p的幂次pap^a,则φ(pap^a)=(p-1)*p(a−1)p^(a-1) ; 如果n为任意两个互质的数a,b的积,则:φ(a*b)=φ(a)*φ(b);如果p为质数。 如果i mod p =0,那么φ原创 2018-03-15 18:29:28 · 522 阅读 · 0 评论 -
BZOJ 2818 GCD
思路:因为要求GCD(x,y)=m,m为素数,有多少有序对。则可以转化为求GCD(a,b)=1,x=a*m,y=b*m,有多少有序对。假设x<=y,则a<=b,因为1<=x<=y<=n,则b<=(n/m).通过枚举素数m,求小于b,与b互斥的有多少个。通过处理欧拉函数的前缀和,每次会多求出一个a=b=1,GCD(a,b)=1的解,又因为是有序对,所以结果为sum[b]*2-1.#include<bi原创 2018-04-19 20:11:33 · 198 阅读 · 0 评论 -
2017 杭州CCPC HDU 6265 Master of Phi
首先要求的是一个积性函数。然后根据积性函数的笛利克雷卷积还是积性函数。具体推导过程: #include<bits/stdc++.h>using namespace std;typedef long long int ll;const int N=10000+10;#define MOD 998244353ll power(ll a,ll b){ ll res=1; wh原创 2018-04-18 20:57:28 · 1110 阅读 · 0 评论 -
B. Jzzhu and Sequences
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=100000+10;const ll MOD =1000000007 ;struct Mar{ ll mat[2][2]; Mar operator *(const Mar &m )const {原创 2018-05-05 21:34:53 · 238 阅读 · 0 评论 -
浙江省省赛 Now Loading!!!
根据题意可以得出分母的范围为:1-30,对于每个a[j]是p^i到p^(i+1)范围内分母都为i+1,对于每个pi最多可以把a[i]数列分为30组,所以枚举每个pi在a[i]中进行二分查找。然后用前缀和处理下a[i]/j。#include<bits/stdc++.h>using namespace std;typedef long long int ll;const int N=500005+原创 2018-05-06 22:32:53 · 253 阅读 · 0 评论 -
数列分块入门 9
题目链接 Orz #include<stdio.h>#include<set>#include<vector>#include<queue>#include<iostream>#include<algorithm>#include<cmath>#include<map>原创 2018-06-20 21:09:43 · 432 阅读 · 0 评论 -
数列分块入门 1
黄老师的博客 题目传送门 有n个元素,如果我们把每m个元素分成一块,共有n/m块,每次区间加的操作会涉及O(n/m)个整块,以及区间两侧两个不完整的块中至多2m个元素。 我们给每个块设置一个加法标记(就是记录这个块中元素一起加了多少),每次操作对每个整块直接O(1)标记,而不完整的块由于元素比较少,暴力修改元素的值。 每次询问时返回元素的值加上其所在块的加法标记 这样总复杂度是O(n*(...原创 2018-06-14 19:34:14 · 199 阅读 · 0 评论 -
HDU6390多校GuGuFishtion
题意:就是要求那个公式和。首先:对一个数中的一个素因子进行分析贡献。设a=p^a1, b=p^a2;则phi(ab)=(p-1)*p^(a1+a2-1);phi(a)=(p-1)*p^(a1-1);phi(b)=(p-1)*p^(a2-1);当a1!=0,a2!=0时;phi(ab)/(phi(a)*phi(b))=p/(p-1)当a1=0时;phi(ab)/(phi(a)*...原创 2018-10-23 20:14:58 · 214 阅读 · 0 评论