
数论
zhhx2001
这个作者很懒,什么都没留下…
展开
-
tyvj模拟赛
待填坑。原创 2016-09-11 08:50:01 · 1174 阅读 · 2 评论 -
乘法逆元模板
void extend_gcd(ll a,ll b,ll &d,ll &x,ll &y){ if (b==0){x=1;y=0;d=a;return;} else {extend_gcd(b,a%b,d,y,x);y-=a/b*x;return;}}ll mod_reverse(ll a,ll n)//a模n的乘法逆元{ ll x,y,d; extend_gcd(a,n,d,x,y原创 2016-05-07 14:26:20 · 303 阅读 · 0 评论 -
codevs1213(扩欧,求区间内解的数量)
求区间内解的数量这一类的题,总是感觉会有很多的细节考虑的不够全。然后就被各种数据搞。。。虽然这题卡数据,需要吐槽,但是也学了一些方法注释中~#include#include#include#include#define ll long longusing namespace std;ll n,x,y;ll a,b,c,q,p,r,s;void exgcd(ll原创 2016-08-23 10:55:57 · 400 阅读 · 0 评论 -
bzoj1407(扩欧)
时间复杂度有点玄学。。。实际上,上面说最少的山洞数小于10^6,实际上就是在提醒枚举山洞的数量,就是枚举模数,判断是否在存活的时间之内会相遇太暴力了。。。对于每个m,枚举两个野人,用exgcd求出最早相遇时间,判断是否都在两个野人是存活时间之内,如果都在,return false注意,如果求出的exgcd无解,也就是方程无解,就代表在这个m下,两个野人根本不可能相遇原创 2016-08-23 15:33:15 · 469 阅读 · 0 评论 -
hdu1787(欧拉函数)
其实这个就是求单个数的欧拉函数模版int work(int n){ int ans=n,sq=(int)sqrt(n);//!!!必须预处理 for (int i=2;i<=sq;i++) if (n%i==0) { ans=ans/i*(i-1); while (n%i==0) n=n/i; } if (n>1) ans=ans/n*(n-1);//必须原创 2016-08-24 07:56:45 · 328 阅读 · 0 评论 -
hdu3501(欧拉函数水)
/*题目大意:* 求1~n里面比n小,但是与n不互素的数的总和。*解题思路:* 利用欧拉函数即可求解,1~n比n小且与n互素的数的总和为* sum(n) = n * phi(n) / 2;那么可以先求出1~n-1的总和(等差数列求和),然后* 减去sum(n)即可。*/#include#include#原创 2016-08-24 08:16:53 · 363 阅读 · 0 评论 -
莫比乌斯反演学习(我就不信我搞不懂它,夏令营之前将专心数学水平突破到一定层次!!!!!!!)
bzoj2301,终于对着模版A了,也算是做过了,感觉仍然是模模糊糊的,或许还需要小心的缕一缕#include#include#include#include#define ll long longusing namespace std;const int N=50009;int mo[N],pri[N],sum[N];bool bb[N];ll a,b,c,d,k;voi原创 2016-07-05 10:52:58 · 515 阅读 · 0 评论 -
noi2010能量采集(在网格点中互质的特点)
首先,如果两个点是互质的话,那么从这个点连线到(1,1)是没有与格点的交点的由此深入,总结一下就是,这个点与(1,1)连线与格点的交点的个数(包括1,1这个点)为gcd(i,j)知道这个结论,轻易推出此题现在只有80分的代码#include#include#include#include#define ll long long using namespace std;原创 2016-06-26 17:00:13 · 296 阅读 · 0 评论 -
poj2891(中国剩余定理模版::不要求模数互质)
#include#include#include#define ll long long using namespace std;ll k;void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if (b==0){d=a;x=1;y=0;return ;} exgcd(b,a%b,d,y,x);y-=x*(a/b);}int main(){ w原创 2016-06-28 07:53:02 · 633 阅读 · 0 评论 -
bzoj4173(欧拉函数)
数据大:10^15次方公式复杂:不知道怎么化简然后,感觉满足打表找规律,发现sigema phi【k】 k属于s(n,m)==n*m。。。。。。。。。。。。再求两个phi就好,注意在括号里面mod之后,需要在括号外面再mod一次,否则会wa。。。#include#include#include#include#include#includeusing n原创 2016-08-24 15:35:02 · 1048 阅读 · 0 评论 -
bzoj3813(线段树+乘法逆元+欧拉函数)
给定一个序列,每个数都由60个最小的素数的乘积构成,求某段的乘积的欧拉函数值对19961993取模后的值,支持单点修改这题看似有难度,实际上主要是题目描述太恶心了,oi真是综合,把语文连着一块考。。关键还是分析出一个数的phi构造,n=π pi^ki那么他的phi就是:(pi-1)*pi^(ki-1)其实通俗点就是,对于每一个质因子k,n / k *(k-原创 2016-08-24 14:42:18 · 458 阅读 · 0 评论 -
bzoj1385(数学)
紫书上原题用gcd来做#include#include#include#includeusing namespace std;typedef long long ll;inline int gcd(ll a,ll b){ return b==0 ? a : gcd(b,a%b); }int main(){ int t; scanf("%d",&t); whil原创 2016-08-23 10:06:06 · 310 阅读 · 0 评论 -
bzoj1408(欧拉函数)
主要是求奇数个素因子和偶数个素因子这phi值之和感觉不好做。。#include#include#include#include#includeusing namespace std;inline int read(){ int ans,f=1;char ch; while ((ch=getchar())'9') if (ch=='-') f=-1;ans=ch-'0'原创 2016-08-24 09:55:50 · 436 阅读 · 0 评论 -
bzoj2705(欧拉函数)
给定一个整数N,你需要求出∑gcd(i, N)(10数据太大,phi函数无法预处理,所以要直接算,这里是要枚举他的因数,以该因数为gcd的数量来算,典型题#include#include#include#include#includeusing namespace std;typedef long long ll;ll n;ll phi(ll n){ ll原创 2016-08-24 10:53:25 · 278 阅读 · 0 评论 -
noip2014解方程(真不知道那些大神怎么想到取模的,竟然考这个?!)
首先,这题需要负数取模(挺醉人的)同时,我知道了取模与求余是不同的,http://blog.youkuaiyun.com/tedious/article/details/8777994such as a%b具体来说,求模运算结果的符号和b一致,求余运算结果的符号和a一致。正如:求模运算和求余运算在第一步不同: 取模求余运算在取c的值时,向0 方向舍入(fix()函数);而求余原创 2016-04-24 21:09:35 · 839 阅读 · 0 评论 -
bzoj2820(莫比乌斯反演)
神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1傻×必然不会了,于是向你来请教……多组输入T = 10000N, M 这个复杂度,枚举质数都要超时。。所以将公式转化,线性筛的时候把,预处理出答案是系数,然后就是标准的下底函数分块难点:1:公式转化,真心十分巧妙 见hzwer的博客 http://hzwer.原创 2016-08-24 21:55:12 · 414 阅读 · 0 评论 -
bzoj1101(莫比乌斯反演)
比上题简单多了,关键还是数据小管用。。不过这道题,卡时卡的太紧了首先对一些常数需要进行潜在的关注1:能用int,就不要用long long,测试的时候发现long long 比int慢一倍,有的时候就可能TLE2:读入优化保平安。不过读入优化只快了200ms,而int比long long快了6000ms。。。。。。。。。。。。。#include#include原创 2016-08-24 23:36:21 · 486 阅读 · 0 评论 -
bzoj2186(欧拉函数+逆元)
首先,n!是m!的倍数,那么小于n!与m!互素的数的个数就是phi【m!】*n!/m!//这里需要用到逆元首先我们想到,m!=1*2*3.......*m-1*m。实际上phi 【m!】就是从这些因子中转移出来,注意这些因子包括了所有相乘的出m!的质数,也就是说,把所有phi【i】(i明天再更新不写逆元会TLE,并且,题目中已经说了,mod为质数,方便判断逆元都是可行的原创 2016-08-23 23:48:08 · 990 阅读 · 0 评论 -
sdoi2008(欧拉函数)
考察了欧拉函数在数学上的特点顺便练了一下代码#include#include#include#includeusing namespace std;int phi[100009],n;void getphi(){ phi[1]=1; for (int i=2;i<n;i++) if (!phi[i]) { for(int j=i;j<n;j+=i)原创 2016-06-24 11:25:59 · 319 阅读 · 0 评论 -
bzoj1477(扩欧)
#include#include#include#include#includeusing namespace std;typedef long long ll;ll x,y,n,m,len;void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if (b==0) {d=a;x=1;y=0;return ;} exgcd(b,a%b,d,y,x原创 2016-08-23 09:44:56 · 392 阅读 · 0 评论 -
等差数列求和公式
公式:Sn=(a1+an)n/2 ;Sn=na1+n(n-1)d/2(d为公差);两个都可以原创 2016-05-07 11:59:06 · 7860 阅读 · 0 评论 -
自己的第一次容斥原理的实践(还有等差数列求和)终于会做数学题了
#include#include#include#include#include#include#include#define ll long long#define mod 376544743using namespace std;ll sn(ll a1,ll an,ll n)//等差数列求和{ return (a1+an)%mod*n%mod*188272372%mo原创 2016-05-07 14:20:30 · 432 阅读 · 0 评论 -
bzoj1257(数学方法)
首先,floor(n/d)的所有情况最多有2*sqrt(n)种,那么列出所有情况,在一定的区间内n/i是相同的(因为相同可以一起算),并且显然他们的余数以n/d为公差作等差数列求和,再将所有不同的n/i的值累积起来,就求出最终答案了给出 100以内的模数100100%1 0100%2 0100%3 1100%4 0100%5 0100%6 4100%7 2原创 2016-07-03 19:52:16 · 409 阅读 · 0 评论 -
扩展欧几里德学习
首先扩展欧几里德算法的应用主要有以下三方面:(1)求解模的逆元;(2)求解不定方程;(3)求解模线性方程(线性同余方程);扩展欧几里德void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if (b==0){d=a;x=1;y=0;return;} else{exgcd(b,a%b,d,y,x);y-=x*(a/b);}}原创 2016-06-17 10:50:29 · 460 阅读 · 2 评论 -
miller rabin 随机素数判定法模版
#include#include#include#includeusing namespace std;const int p[8]={3,5,7,11,13,17,19,23};//8个int power_mod(int a,int b,int n)//快速幂{ int i=0,ans=1; while ((1<<i)<=b) { if (b&(1<<i)) ans=a原创 2016-07-04 17:49:53 · 407 阅读 · 0 评论 -
hdu1573(中国剩余定理,在区间内解的数量)
求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 Input输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为两个正整数N,M (0 表示X小于等于N,数组a和b中各有M个元素。接下来两行原创 2016-06-28 09:53:09 · 1051 阅读 · 0 评论 -
hdu3575(中国剩余定理,注意特殊情况处理)
#include#include#include#include#define ll long long using namespace std;ll n,m[10009],a[10009];void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if (b==0){d=a;x=1;y=0;return ;} exgcd(b,a%b,d,y,x);y原创 2016-06-28 08:49:44 · 495 阅读 · 0 评论 -
中国剩余定理模版
int china_mod(intmod[],inta[]){ int lcm,i,ans,Mi,x,y; lcm=1; for(i=0;i<n;i++) lcm*=mod[i]; ans=0; for(i=0;i<n;i++) { Mi=lcm/mod[i]; exgcd(Mi,mod[i],d,x,y); ans原创 2016-06-27 21:34:26 · 247 阅读 · 0 评论 -
poj2480(欧拉函数,必须回顾的题)
欧拉函数的思想!!!!刚开始写跪了,一直wa,太晚了,就只好先这样了#include#include#include#include#define ll long long using namespace std;ll n,num[90000];ll phi(ll x){ ll ans=1; for (ll i=2;i*i<=x;i++) { if (x%i) c原创 2016-06-26 22:42:55 · 765 阅读 · 0 评论 -
bzoj2818(欧拉函数的应用!!!!!!!!!!!!!!)
给定整数N,求1数对(x,y)有多少对.枚举每个素数,然后每个素数p对于答案的贡献就是(1 ~ n / p) 中有序互质对的个数而求1~n中有序互质对x,y的个数,可以令y >= x, 当y = x时,有且只有y = x = 1互质,当y > x时,确定y以后符合条件的个数x就是phiy所以有序互质对的个数为(1 ~ n/p)的欧拉函数之和乘2减1(要求的是有序互质对,原创 2016-06-26 17:46:18 · 426 阅读 · 0 评论 -
hdu1005(循环节的经典问题)
注意一点细节,其他的并不是特别难,就是需要分析好所有的情况,然后对拍对拍再对拍即可#include#include#include#includeusing namespace std;int g[10][10],a,b,n;int main(){ while (scanf("%d%d%d",&a,&b,&n)!=EOF) { if (a==0&&b==0&&n==0)原创 2016-07-05 16:44:08 · 437 阅读 · 0 评论 -
hdu4497(唯一分解+排列组合算组数)
代码短,但是速度慢一点#include#include#include#include#define ll long longusing namespace std;ll gcd,lcm;ll pg[1090],ag[1090],pl[1090],al[1090],tot;int main(){ int T; scanf("%d",&T); while原创 2016-07-06 09:16:28 · 676 阅读 · 0 评论 -
hdu5019(gcd性质水题)
首先求第k大的gcd,辗转相处的gcd是第一大的,并且第几大的一定是gcd的因数,所以只要乱搞找出即可#include#include#include#define ll long longusing namespace std;ll a,b,k;ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}int main(){ int原创 2016-07-06 09:44:24 · 471 阅读 · 0 评论 -
bzoj1008(简单计数问题+快速幂)
#include#include#include#include#includeusing namespace std;typedef long long ll;const ll mod=100003;ll n,m;ll power_mod(ll a,ll b){ ll ans=1; a=a%mod; while (b) { if (b&1) ans=ans*原创 2016-08-19 15:49:17 · 286 阅读 · 0 评论 -
bzoj2226(数论)
本来找了O(n^1/2)的方法,对拍过后没问题,交上竟然超时,果然复杂度需要更低,然而这就属于不在我的能力范围之内的积性函数的运用了但是,发现只要这个知识点我学过,那么只要时间足够,就一定能想出做法,在做这个题时想过放弃,但是坚持就会有好的结果根n算法通过打表,找了一下规律,同时发现gcd(a,n)==gcd(b,n)==d,那么,他们最大公约数相同,化成lcm就是a*n/d,b*nd原创 2016-07-28 17:56:51 · 373 阅读 · 0 评论 -
BSGS模版(求解离散对数,模数p是不是质数都可以)
抄的邝斌的模版,感觉写的真心简洁,并且,这个hash判重的方法也很好#include#include#include#include#define ll long longusing namespace std;ll b,n,p;/***************************************/下面就是BSGS的函数集,包括所需变量const int原创 2016-07-07 17:28:18 · 992 阅读 · 0 评论 -
hdu3388(二分+容斥)。。无限超时
对拍没有问题,然而一交无限超时,可能又是写炸了,觉得放一放先学BSGS吧#include#include#include#include#define ll long longusing namespace std;ll n,m,k;ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}int main(){ int T; sc原创 2016-07-07 15:49:24 · 370 阅读 · 0 评论 -
hdu2841(网格中gcd=1的性质
从0,0的点向矩阵中看,如果点(x,y)&&gcd(x,y)=1那么,他是可以被看到的否则,不能被看到结论:两个数字(x,y)如果两数互质,则可以被看到,如果不互质,则看不到,所以我们就是要找出所有的二元组(x,y)使他们互质这题,可以枚举x,求1~y中有多少数与x互质,互质不好求,可以求不互质的数的个数,x与1~y中不互质的数的数对个数,就是1~y中以x的质因数为倍数的数因为最小原创 2016-07-07 11:43:28 · 528 阅读 · 0 评论 -
hdu1796(二进制容斥原理基本运用)
给出n,和m个数,求小于n,且可以被m个数中任意一个整除的数有哪些?就二进制枚举哪些数,然后取最小公倍数,搞一搞就可以了#include#include#include#include#define ll long longusing namespace std;ll n,m,a[20];ll gcd(ll a,ll b){ return b?gcd(b,a%b)原创 2016-07-07 09:58:00 · 1601 阅读 · 0 评论 -
hdu2685(有点偏啊,不过可以看看数学证明)
这道题要知道这个公式:gcd(am-1,an-1) = agcd(m,n)-1推广:若 gcd(a,b)=1gcd(am-bm,an-bn) = agcd(m,n)-bgcd(m,n)#include#include#include#include#define ll long longusing namespace std;ll a原创 2016-07-07 09:25:32 · 914 阅读 · 1 评论