
数论真的太难了
stone41123
一名苦逼的OIer,欢迎交朋友。。。
展开
-
hdu5628 : Clarke and math(线性筛)
这题以前用快速幂写的 今天用线性筛写了一下,真刺激 大概就是说那个东西是 f∗1kf∗1kf*1^k 然后你只要算出来1k1k1^k 就可以O(nlogn)O(nlogn)O(nlogn)卷积了 关于算1k1k1^k当然可以直接快速幂 O(nlognlogk+nlogn)O(nlognlogk+nlogn)O(nlognlogk+nlogn) 然而有更好的做法,我们可以线性筛 首...原创 2018-04-09 17:59:01 · 304 阅读 · 0 评论 -
洛谷10月月赛R1-T1-一道中档题 Factorial
传送门 首先,我们可以这样分解阶乘质因数: cnt(p)=∑i=1∞⌊npi⌋cnt(p)=\sum_{i=1}^{\infty} \big\lfloor {\frac n {p^i}}\big\rfloor 也就是枚举质数一直除,具体原理可以自己想,我不多说。 对于这个题,大家应该有些人做过这个题的简单版本吧: 求n!末尾0的个数。 这个题的做法还是很简单的,用上面那个方法筛出2和5的原创 2017-10-08 01:28:47 · 298 阅读 · 0 评论 -
Miller-Rabin素数判断
这个算法要过线性筛模板好难啊 改了好几次才卡到单点800ms过了 其实这个算法就是玄学,就是不断地取随机数,一直用什么什么定理去试,然后还说什么出错几率非常小,其实还是会错的呀,所以要我说就是玄学(虽然模板题100000个数都过了吧。。) 一般来说试10次比较保险,其实5次左右就够(尤其是卡时间的时候) 其实学这个算法就是为了学pollard-rho质因数分解,要不然我会来学这么玄学的东西?原创 2017-10-15 17:23:32 · 256 阅读 · 0 评论 -
洛谷10月月赛R2-T3-Nephren Ruq Insania
传送门 这个题明显扩展欧拉定理,也就是这个定理: abmodc=a(bmodϕc)+ϕcmodca^b\mod c=a^{(b\mod \phi c)+\phi c}\mod c我们可以递归地去做那个式子,一直取phi,再加个快速幂(=ksm=kasumi)就好了。 所以就可以做了。 还有就是这么一直取phi,最多只会取log2plog_2 p次,就会变成1,然后就是: amod1+ϕ1=原创 2017-10-21 13:41:09 · 567 阅读 · 1 评论 -
清北学堂-D6-T1-divisors
这个题不用我多说,洛谷原题,改一下就好了,贴一个链接自己看吧。 我的blog 代码:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;ll prim原创 2017-10-06 14:06:37 · 471 阅读 · 0 评论 -
清北学堂-D5-T1-cut
可以发现,第一刀必须把两个部分切成斐波那契数列两项的倍数,然后才能避免切不下去的情况。 然后我们就可以O(n√)O(\sqrt n)枚举约数d,判断n/d是否是斐波那契数列中的一项,然后统计答案,再对m做同样的,就好了。 代码:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algori原创 2017-10-06 11:21:41 · 953 阅读 · 0 评论 -
洛谷 P3404 斐波那契(线段树)
传送门 首先肯定是线段树,然后问题就是怎么打标记。 观察题目,可以发现,修改操作其实就是给一段区间加上从1到r-l+1的斐波那契数列。 那么思路就是:预处理斐波那契数列前缀和,这样可以O(1)查询斐波那契数列和。然后打标记的时候,比如要修改[L,R],那么统一都打成L-1,然后更新的时候就可以O(1)修改sum值了。 具体就是比如区间[l,r],那么更新时就是: sum[rt]=(sum[原创 2017-09-16 12:09:43 · 571 阅读 · 0 评论 -
清北学堂-D1-T1-alien
题目大意:给定长度为n的序列,计算∑ni=1∑nj=i+1ai\sum_{i=1}^n\sum_{j=i+1}^n a_i^aja_j 题解:此题较水,按位讨论01个数,乘起来计算贡献就好,记得开longlong 代码:#include<cstdio>#include<cstdlib>#include<iostream>#include<cmath>#include<cstring>#原创 2017-10-01 18:02:42 · 357 阅读 · 0 评论 -
清北学堂-D2-T2-chance
首先,我们一定要求出每个[l,r]内的满足条件的数的个数,方法也很简单,一位一位算就好了,具体可以看我的代码。 然后就可以求出在每一个袋子里抓球是否是1的概率了。 然后考虑如何求题目中的问题。 然后发现那个k%其实就是n*k/100,这个值不会超过n。 然后就可以很容易的设计出一种状态来进行dp, 设f(i,j)代表前i个袋子中有j个是1的概率设f(i,j)代表前i个袋子中有j个是1的概率原创 2017-10-02 15:09:18 · 636 阅读 · 0 评论 -
【NOIP2017提高A组集训10.22】幸运值
Description校庆志愿者小Z在休息时间和同学们玩卡牌游戏。一共有n张卡牌,每张卡牌上有一个数Ai,每次可以从中选出k张卡牌。一种选取方案的幸运值为这k张卡牌上数的异或和。小Z想知道所有选取方案的幸运值之和除以998244353的余数。Input输入的第一行有两个整数n和k。 第二行有n个整数,表示序列A。Output一个整数表示答案。Sample Input输入1: 3 2 1 2 3原创 2017-10-23 16:15:38 · 561 阅读 · 0 评论 -
洛谷10月月赛R1T1-SAC E#1 - 一道中档题 Factorial(pollard-rho质因数分解)
传送门 小数据做法(改了之后):http://blog.youkuaiyun.com/stone41123/article/details/78172763 大数据做法(没改之前的数据范围): 我们沿用之前的做法,只是质因数分解如果再用O(n√)O(\sqrt n)的,那么就会TLE 我们可以使用pollard-rho质因数分解,听说时间是O(n14)O原创 2017-10-15 22:08:19 · 347 阅读 · 0 评论 -
[bzoj3944]:Sum(杜教筛)
传送门 杜教筛好神奇啊 杜教太强辣 就是基于一些式子(懒得写了。) 然后预处理前n2/3n^{2/3}的前缀和,然后复杂度就是O(n2/3)O(n^{2/3})了 代码:#include#include#include#include#include#include#include#define ll long long#define max(a,b) a>b?a:b原创 2018-01-17 15:39:57 · 264 阅读 · 0 评论 -
[Codeforces757E] : Bash Plays with Functions(积性函数)
传送门 这个东西在r=0的时候,就是 f0(n)=2(n的质因子个数)f_0(n)=2^{(n的质因子个数)} 然后这个东西明显是个积性函数 然后题目里给的式子其实就是代表fr+1=fr∗1f_{r+1}=f_r*1 然后因为f0和1f_0和1都是积性函数,那么当r∈Nr\in N时都满足frf_r是积性函数 然后我们有这样一个递推式dp[i][j]=∑jk=0dp[i−1][k]dp[原创 2018-01-17 11:13:35 · 376 阅读 · 0 评论 -
洛谷11月月赛 T3 斐波那契数列
传送门 这个题就是需要一个规律,然后还有一些数论知识。 首先来推规律吧。 f(0)=af(0)=a f(1)=bf(1)=b f(2)=a+bf(2)=a+b f(3)=a+2bf(3)=a+2b f(4)=2a+3bf(4)=2a+3b f(5)=3a+5bf(5)=3a+5b f(6)=5a+8bf(6)=5a+8b f(7)=8a+13bf(7)=8a+13b 想必写到这原创 2017-11-27 14:23:54 · 367 阅读 · 0 评论 -
[codeplus 11月月赛]T1 jogging
传送门 大水题。。。 就是算三个数的lcm 然后我为了防爆,就用了质因数分解。。 代码:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;inl原创 2017-11-27 11:51:07 · 274 阅读 · 0 评论 -
扩展CRT&&扩展lucas
直接上板子,这里没有证明,只是提供一个还不错的板子 扩展CRT:#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;inline int read(){原创 2017-12-22 21:54:42 · 585 阅读 · 0 评论 -
[NOI2010]:能量采集
传送门 首先,80分暴力很明显,直接枚举然后算gcd就好了 然后其实100分也很简单(要不然怎么可能给80分暴力) 枚举gcd,然后算有多少个gcd(i,j)=d就好了,这里需要减去之前重复的,可以看我的代码。 代码:#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>原创 2017-12-13 21:46:33 · 236 阅读 · 0 评论 -
【NOIP2017提高A组集训10.25】数论 (此题纯属搞笑)
Description聪明的0v0正在学习莫比乌斯反演。 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵…… 剩下的题面,聪明的0v0不记得了。但是,她通过自己高超的数论技巧,给出了一个转化后的模型:给出n和m,求 聪明的0v0当然知道怎么做了,但是她想考考你。Input一行三个正整数n,m,p。Output一行一个非负整数,设答案为x,输出x mod p。Sample Inpu原创 2017-10-26 13:11:19 · 533 阅读 · 0 评论 -
【NOIP2017提高A组冲刺11.2】救赎(数学期望)
Description“是的。”我回答,“我不会忘记你。在森林里我会一点点记起往日的世界。要记起的大概很多很多:各种人、各种场所、各种光、各种歌曲……” ——村上春树《世界尽头与冷酷仙境》在没有心存在的世界尽头,音乐能够使小镇居民消散的心重新聚拢成形。作为镇子里唯一一个还残留着些许音乐记忆的人,我逐渐记起了往昔点滴……记忆中有一棵无根树,有n个节点。 对于一棵有根树的每一个非叶子节点,我们都等概原创 2017-11-02 13:35:44 · 448 阅读 · 0 评论 -
清北学堂-D2-T1-video
暴力算组合数,算个逆元就好了。 费马小定理和扩欧都可以。 代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#define ll long longusing namespace std;ll ksm(ll a,ll b,原创 2017-10-02 14:57:18 · 273 阅读 · 0 评论 -
清北学堂-D1-T2-polyline
题目给定了若干条直线,并将它们的小于0的部分强制改为0,然后定义了一个累加函数,将所有函数加到一起,然后求拐点个数。 题解:可以看出,所有函数单独拿出来斜率单增,所以加到一起斜率也是单增的,然后问题就变成了求不同的零点个数,然后有两个办法,一个卡精度,另一个就是改一下比较函数,不要算零点(那个比较的函数可以去掉除号,可以互相乘过去),然后就判断就好了。 代码:(卡精度)#include<cstd原创 2017-10-01 18:42:11 · 278 阅读 · 0 评论 -
洛谷 P3317 [SDOI2014]重建(矩阵树定理+数学推导) [bzoj3534]
传送门 首先,大家应该都能看出来这是矩阵树定理,然后大部分人应该就会把概率直接带进去算,然后就愉快地WA掉了(我当时就是这么想的,幸亏没交) 然后就来讲这个题的正解思路。 首先我们来看答案应该是怎样的: ans=∑Tree∏(u,v)∈EP(u,v)∏(u,v)∉E(1−P(u,v))ans=\sum_{Tree}\prod_{(u,v)\in E} P_{(u,v)}\prod_{(u,v原创 2017-09-21 12:07:19 · 1089 阅读 · 0 评论 -
洛谷 P1306 斐波那契公约数
题目大意:求gcd(fib(n),fib(m))gcd(fib(n),fib(m)) 这个题就是结论题: gcd(fib(n),fib(m))=fib(gcd(n,m))gcd(fib(n),fib(m))=fib(gcd(n,m)) 没什么可说的。 代码:#include<iostream>#include<cstdio>#include<cstring>#include<algor原创 2017-09-16 11:58:44 · 276 阅读 · 0 评论 -
洛谷 P1463 [SDOI2005]反素数ant && P1820 寻找AP数
传送门1 传送门2 这个题又是一个双倍经验题。 对于这种题,我的思路从来都是: 1.暴力打表 2.找规律 3.试着写正解 首先打表,我当时打出了小于等于100000的所有符合条件的数,直接看也没看出来什么,然后当然就是老套路了–质因数分解,发现规律: 1.分解出来的质因数一定连续 2.质因数的幂次一定不上升 3.由(1)可得质因数最多10种 然后就可以dfs了,可以加各种剪枝:原创 2017-09-16 11:55:18 · 347 阅读 · 0 评论 -
洛谷 P2480 [SDOI2010]古代猪文
传送门题解欧拉定理(模指数)+lucas定理(组合数)+中国剩余定理(合并) 要说的一点就是一定要给自己写一个好看的代码,不然就根本没办法调试,就像我原来的30分。。。 代码:#include<bits/stdc++.h>#define ll long longusing namespace std;inline ll ksm(ll a,ll b,ll p){ ll ans=1;原创 2017-08-29 21:58:13 · 659 阅读 · 0 评论 -
洛谷 P2715 约数和(唯一分解定理+等比数列求和+乘法逆元)
传送门用逆元的看这里!还是和前面几个一样: 因为要取模,所以除法要换成逆元,然后我就愉快地写完交了上去,60分,4个WA,发现,逆元求出来之后可以是负的,也可以是零,于是就加了这么一个特判: if(num2<=0)num2+=p;(其中num2是我求的逆元,p是模数) 然后就AC了,根本不需要他们说的什么奇怪的逆元方式。。 代码:#include<iostream>#include<c原创 2017-09-14 20:37:53 · 508 阅读 · 0 评论 -
[六省联考2017]组合数问题
题目大意:求这个式子:∑i=0∞Cik+rnk(modp)\sum_{i=0}^\infty C_{nk}^{ik+r} \pmod p 这道题就是个数学题,做法其实就是优化的暴力——杨辉三角矩阵加速。 可以加速的原理,其实就是杨辉三角是一个一维递推,并且可以将递推描述为:复制矩阵到一个新矩阵,然后矩阵右移一格,加到新矩阵中。 对于这个题来说就可以用k∗1k*1的初始矩阵来乘以一个k∗kk*k原创 2017-08-29 16:17:46 · 903 阅读 · 0 评论 -
洛谷 P3197 [HNOI2008]越狱
来来来,日常水一篇(滑稽)题目描述监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱输入输出格式输入格式: 输入两个整数M,N.1<=M<=10^8,1<=N<=10^12输出格式: 可能越狱的状态数,模100003取余输入输出样例输入样例#1: 2 3 输出样例#1: 6说原创 2017-08-24 10:56:04 · 248 阅读 · 0 评论 -
洛谷 P2359 三素数数
日常水一篇(滑稽)题目描述如果一个数的所有连续三位数字都是大于100的素数,则该数称为三素数数。比如113797是一个6位的三素数数。输入输出格式输入格式: 一个整数n(3 ≤ n ≤ 10000),表示三素数数的位数。输出格式: 一个整数,表示n位三素数的个数m,要求输出m除以10^9 + 9的余数。输入输出样例输入样例#1: 4 输出样例#1: 204题解这题明显dp。 预处理素数表原创 2017-08-23 20:33:12 · 695 阅读 · 0 评论 -
一名提高选手的数论之路(二)
1.乘法逆元(inv)两种求法: First: 根据费马小定理:ap≡a(modp)a^p\equiv a\pmod p 可得ap−2≡a−1(modp)a^{p-2}\equiv a^{-1}\pmod p 由此可知,ap−2modpa^{p-2}\mod p即是a在模p意义下的逆元 然而ap−2a^{p-2}可以轻易用快速幂算出 Second: 通过扩展欧几里得算法来求:exgcd原创 2017-08-22 22:56:37 · 371 阅读 · 0 评论 -
洛谷 P1445 没占到1444的愤怒
传送门 不得不吐槽一句,这题出题人真的很逗 以下我copy一段别人的题解: 1/x+1/y=1/n!先通分(x+y)/xy=1/n!再化整数xy-(x+y)*n!=0然后配平(n!)^2-(x+y)*n!+xy=(n!)^2最后(x-n!)*(y-n!)=(n!)^2然后我们发现x,y都要是正整数;所以原题可以变为A*B=(n!)^2;当A*B为正整数的时候x,y显然也是正整数; 1/原创 2017-09-16 12:08:05 · 237 阅读 · 0 评论 -
洛谷 P2568 GCD(欧拉定理 | | 莫比乌斯反演)
题目描述给定整数N,求1<=x,y<=N(N<=1e7)且Gcd(x,y)为素数的数对(x,y)有多少对.输入输出样例输入样例#1: 4 输出样例#1: 4题解此题有两种解法。 1.欧拉函数 很明显,可以枚举素数p,计算n/p的phi,然后统计出来乘以2,最后再特判x==y且x,y为素数的情况。#include<bits/stdc++.h>#define ll long longusi原创 2017-08-31 01:15:57 · 631 阅读 · 0 评论 -
[bzoj1002]: [FJOI2007]轮状病毒(矩阵树定理)
传送门 此题好像本来要用矩阵树定理(matrix-tree),可是好像可以推式子,退出来就是: f(n)=3f(n−1)−f(n−2)+2f(n)=3f(n-1)-f(n-2)+2f(1)=1,f(2)=5f(1)=1,f(2)=5 然后套板子就过了. 代码:/**************************************************************原创 2017-09-21 10:05:11 · 515 阅读 · 0 评论 -
洛谷 P2759 奇怪的函数
传送门 这题我算是0分,因为这题没有部分分,我也不会,思路太不好想,一看题解,就知道了,觉得好简单,唉。 做法:题目里的其实就是这个式子xx>=10n−1x^x>=10^{n-1} 用数学知识简单变形:x∗(log10x)>=n−1x*(log_{10}x)>=n-1 然后可以发现左边递增,二分做就好了。 代码:#include<iostream>#include<cstdio>#in原创 2017-09-11 13:57:16 · 254 阅读 · 0 评论 -
洛谷 P2290 [HNOI2004]树的计数(bzoj[1211])
做法:Prufer序列&&Cayley定理&&组合数学(推广) 没学过的可以戳这里看matrix67大佬讲课:经典证明:Prüfer编码与Cayley公式 然后就是对于这个题了。 这里先摘抄一段话: 一个有趣的推广是,n个节点的度依次为D1, D2, …, Dn的无根树共有(n-2)! / [ (D1-1)!(D2-1)!..(Dn-1)! ]个,因为此时Prüfer编码中的数字i恰好原创 2017-09-08 12:15:14 · 313 阅读 · 0 评论 -
洛谷 P3211 [HNOI2011]XOR和路径(推dp+高斯消元)
传送门 首先,异或的话直接讨论不好讨论,那么我们可以按位讨论,对于每一位讨论出来一个结果,然后将结果相加就好了。 然后考虑怎么讨论一位上的结果。 我们可以设出来一个dp方程:f(i)f(i)表示i到n的异或和期望值,则初始状态为f(n)=0f(n)=0 dp转移方程就是:其中weight(u,v)weight(u,v)代表(u,v)(u,v)的那一位的值 f(v)=∑(u,v)∈Ef(u)原创 2017-09-19 11:19:34 · 612 阅读 · 0 评论 -
洛谷 P2447 [SDOI2010]外星千足虫(高斯消元bitset优化)
传送门题解上午才学了高斯,下午准备做几个题实践一下,然后就看见了这个题。。 我看完题,就觉得,这题好裸啊,然后就去看数据范围,发现n<=1000,m<=2000,我就很郁闷,高斯不是O(n3)O(n^3)吗??怎么搞啊?? 然后果断看题解,一看见题解里说bitset,我就知道了,因为矩阵里只会出现0和1,所以可以bitset优化。。 还有就是这题要把加法改成XOR,因为是mod2,所以就是求奇原创 2017-09-09 15:14:30 · 422 阅读 · 0 评论 -
数论--高斯消元法
高斯消元是一个常用的解n元一次方程组的方法。 1.处理数据: 我们设方程Ai−>ai1x1+ai2x2+…ainxn=biA_i->a_{i1}x_1+a_{i2}x_2+…a_{in}x_n=b_i 那么对于A1−AnA_1-A_n这n个方程,我们可以将它们放在一个矩阵里,方便操作。 例如这样: 2x1+4x2=102x_1+4x_2=10 −3x1+2x2=1-3x_1+2x_2=1原创 2017-09-09 12:07:30 · 384 阅读 · 0 评论 -
洛谷 P2261 [CQOI2007]余数求和
传送门 这个题是典型的除法分块,对题目中的式子进行变形: n∗k−∑ni=1(k/i)∗in*k-\sum_{i=1}^n (k/i)*i 发现k/i的值只有O(n√)O(\sqrt n)种,那么就可以进行分块了。 代码:#include<cstdio>#include<algorithm>#define ll long longusing namespace std;ll n,k,原创 2017-09-17 15:45:36 · 247 阅读 · 0 评论 -
洛谷 P2522 [HAOI2011]Problem b(莫比乌斯反演+容斥)
题目大意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。 数据范围:100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000题解询问可以用容斥来解决,就转换成了那个题了:1<=x<=n,1<=y<=m 和上次那个题差不多,还是推公式。 传送门原创 2017-08-31 13:51:26 · 318 阅读 · 0 评论