- 博客(78)
- 收藏
- 关注
原创 UVa 10325 The Lottery 容斥原理
传送门题意:求1-n中不能被给出的m个数整除的个数思路:典型容斥原理,但值得注意的是这里要除的是选出的数的组合的最小公倍数完整代码:#include #include #include #include using namespace std;typedef long long LL;LL divv[20];LL gcd(LL a,LL b){ if(b==
2017-08-08 16:06:16
317
原创 poj3904 容斥原理或莫比乌斯反演
传送门题意:从给出的n个数中选取4个最大公因数为1的四元组的选取数思路:感觉容斥问题都有一个很相似的地方,就是要从问题的逆方向来考虑,所谓正难则反,这也是思维中一个很重要的地方。我们来考虑这个逆问题,便是选取4个最大公因数不为1的四元组,总选取方式为C(n,4)那么也就是这四个数的最大公因数里至少有一个素数,换句话说,至少有一个相同的素数能够将这四个数整除,如果这n个数中有m个数是这个素数
2017-08-08 15:40:15
439
原创 hdu4059 容斥原理
传送门题意:求小于n的与n互素的数的四次方的和对1e9+7取模。思路:我们还是考虑一下逆问题,求小于n的与n不互素的数的四次方和,所以还是枚举n的素因子,再用容斥原理,这里需要一个公式就是1+2^4+3^4+...+n^4,百度一下就可以得到,简单推导一下,利用了累加法,考虑了比四次方高一次的五次来求(n+1)^5-n^5=1+5n+10n^2+10n^3+5n^4,那么: n^5
2017-08-08 15:09:38
448
原创 容斥经典:求1-m中与n互素的数的个数(hdu4153)
hdu4153是一个很经典的容斥原理的题目,先贴一下链接:http://acm.hdu.edu.cn/showproblem.php?pid=4135题意:求区间a-b内与n互素的数的个数思路:考虑一下逆问题:区间a-b内不与n互素的数的个数,不互素那么一定至少有一个相同的素因子,这样我们就可以枚举n的素因子,来探讨区间a-b中有的n的某个素因子个数,但是并不好计算,所以我们考虑1-(a-
2017-08-08 13:42:08
4573
原创 BZOJ 1951 lucas定理 中国剩余定理
传送门照旧记录一下,不然担心以后碰到类似的题依旧不知道怎么做……题意:求G^(sigma(C(N,i)))%MOD,MOD=999911659,i是N的因子(包括1和本身),首先幂次非常大,所以先降幂次,即sigma(C(N,i))%(MOD-1)+(MOD-1),那么关键就是求sigma(C(N,i))%(MOD-1),我们可以遍历能整除N的数,但999911658是一个合数,它可以分解
2017-08-05 20:28:13
414
原创 hdu4373 lucas定理+中国剩余定理
传送门想做好这个题真的真的好不容易啊T T题意:定义两种循环,第一种循环是直接从1-n,第二种循环是从上一层循环的数字到n,给出两种类型的循环,求最后总循环次数,再对364875103取模思路:计算循环次数,第一种循环就不用说了,第二种循环是通过找规律归纳出来结果……第二种循环的开始一定是第一种循环,若是第一种循环里只有一个第二种循环即for(a[0]=0;a[0]
2017-08-05 11:02:17
383
原创 zoj3557 大组合数取模
传送门题意:从n个数中取m个不相邻的数的取法思路:取不相邻的数,这不就是传统的插空法吗,不是插板法,不是插板法,不是插板法!先从n中任意选择m个数,然后在剩下的n-m个数中插空来保证不相邻,而插板法一般是相同元素分组,不相邻的问题一般都用插空法做(高中数学都要还给老师了 T T),所以最后的结果是C(n-m+1,m)再对一个素数取模,n、p比较大,用lucas定理即可完整代码:#i
2017-08-04 11:22:12
295
原创 hdu3944 lucas定理+阶乘预处理
传送门题意: 给出两个值n、m,求从杨辉三角上从上到下,只能向下或向右下,到位置(n,m)的和的最小值思路: 画出杨辉三角很容易就可以发现,我们逆着看,若m端,若m>n/2,则最小和在这个数一直向上到最上时再左上到最顶端,由于组合数的性质C(n,m)=C(n,n-m),所以我们只看m>n/2的时候,那么sum=C(n,m)+C(n-1,m)+C(n-2,m)..+C(m,m)+
2017-08-03 20:09:31
489
原创 nefu628 组合数取模,模不是素数的情况
传送门题意:求C(m+n-2,m-1)%p,其中1思路:数据范围并不是很大,但关键是p不一定是素数,所以传统求逆元的方法如费马小定理或者扩展欧几里得都不适用了,C(m+n-2,m-1)=(m+n-2)!/((n-1)!*(m-1)!),可以把这个数暴力分解素因子,计算其中包含的素因子个数,然后再用快速幂计算,累乘就得到了最后的结果。十分暴力。#include#include#inc
2017-08-03 15:55:28
1234
原创 bzoj2186: [Sdoi2008]沙拉公主的困惑 逆元
传送门题意:求1-n!中与m!互质的数的个数,其中m小于n。思路:由于m小于n,所以n!一定是m!的倍数,小于m!与m!互质的数的个数为phi(m!),所以1-n!中与m!互质的数的个数为n!/m!*phi(m!)=n!/m!*m!*(1-1/p1)*(1-1/p2)*...(1-1/pk) =n!(1-1/p1)*(1-1/p2)*...(1-1/pk)其中p1-pk是m!的素因子,其实
2017-08-03 11:21:04
381
1
原创 poj1845 逆元 因子和
传送门主要目的还是记录一下,学习了学长博客http://blog.csdn.net/acdreamers/article/details/8220787,写的比我清楚很多……题意:求a^b的因子和对9901取余 思路:一个数的因子和求法:对n素数分解,n=p1^a1*p2^a2*...*pk^ak因子和=(1+p1+p1^2+...+p1^a1)*(1+p2+p2^2+...+p2
2017-08-02 20:16:38
273
原创 poj3370 抽屉原理
传送门抽屉原理的题目,对每个数求前缀和,那么总共有n个前缀和,再分别对c取余,若某个前缀和为0,那么这前几个数便是符合题目的答案,如果没有0,由于c至少有两个前缀和取余后相等,那么这两个数之间的数便符合题意,代码O(n)复杂度#include #include #include using namespace std;typedef long long ll;int da
2017-08-02 10:56:15
443
原创 hdu3037 组合数 lucas定理
传送门题意:n个树保存不超过m个豆子的所有方法。思路:首先题目转化成x1+x2+x3+......+xn=a,其中的a由0-m中取,这个不定方程的解的个数由插板法得到,由于x1到xn可以取到0,为了方便计算,方程写为(1+x1)+(1+x2)+(1+x3)+......+(1+xn)=a+n,总共a+n-1个空,要插n-1个板子,分成n组所以结果便是C(a+n-1,n-1)=C
2017-07-31 19:53:49
279
原创 poj2079 triangle 凸包 旋转卡壳
传送门题意就是从给定的点中找出面积最大的三角形。很明显三个点都是凸包上的点,要求一下凸包,但是三角形的边长不一定是凸包的边!!!我们一般做旋转卡壳的时候是固定两个点,来找第三个点,但此题由于边长不一定是凸包的边长,所以底边还要判断一遍……#include#include#include#includeusing namespace std;const int MAXN
2017-07-29 11:01:28
253
原创 hdu5251 凸包 旋转卡壳
传送门:hdu5251 矩形面积 接触了旋转卡壳不久,感觉很神奇…… 这个题是要寻找一个矩形来覆盖住桌面上的小矩形,小矩形即四个点啦,所以就是找一个矩形覆盖住这些点,也就要求一个凸包,再用矩形把凸包盖住,那就很明显的是旋转卡壳了,类似旋转卡壳求凸包的宽度,只是这是求矩形面积的最小值完整代码:#include#include#include#in
2017-07-28 19:29:12
295
原创 51 nod oj 1189 素因子分解+逆元
题目:传送门走起之前有做过一个类似的题目,再来一个传送门,最后公式的推导结果就是求n的素因子个数,那么这个题也类似,就是求n!的素因子个数,这一点还是参考了网上的资料:参考链接n!可以表示为n!=k^m*m!*a其中k为这个素因子,m为含有这个素因子的数量,a为不含有这个素因子的其它数的乘积,然后再对m使用相同的方法,最终就可以得到k这个素因子的个数了这个公式十分好理解
2017-07-28 11:17:25
428
原创 uvalive6859 凸包
/**这个题是在网格上找能围住所有的点的几何体周长,比较容易能想到凸包几何体显然是由点周围的点组成的,所以把每个点的上下左右都加入点集,然后再求一个凸包。由于两点之间不能直接相连,所有的点只能由网格的边长和对角线相连,所以再求d1=list[stack[i]].x-list[stace[i+1]].x 和d2=list[stack[i]].y-list[stack
2017-07-27 13:54:58
239
原创 51nod oj 1298 圆与三角形
/**如果三角形的三个点都在圆内,那么一定不相交;如果三个点都在圆外,那么可能相交也可能不相交;其它情况一定相交(某个点在圆上或者有在圆内的有在圆外的)这题注意用longlong**/#include#include#include#include#include#includeusing namespace std;typedef long long ll;struct p
2017-07-26 20:57:56
304
原创 51Nod 1119 机器人走方格 组合数学
组合数学就是组合数学啊……感觉脑子不如高中……右走m-1步,左走n-1步,所以走的方法就是c(m-1+n-1,n-1),当然如果数据比较小的话,用递推就可以了。c(m-1+n-1,n-1)=(m+n-2)!/((n-1)!(m-1)!)最后对1e9+7求模,这里用费马小定理求一下逆元就可以了。#include#include#include#include#includ
2017-07-25 19:56:19
321
原创 hdu2177威佐夫博弈
其实就是分析一下威佐夫博弈的原理,先设小的数量的一堆是a,大的数量的一堆是b如果(b-a)*(sqrt(5)+1)/2等于小的值,那么就可以保证后手赢那么分析先手赢的原理便是先手拿了一次后使新的差值*(sqrt(5)+1)/2等于小的值即可第一次拿有两种情况:1、如果第一次在两堆中拿的数目相同,那么差值是不会变的,那么就能很容易得到拿了一次后两堆中数量小的值 如果
2017-06-24 19:25:14
380
原创 hdu5667 Sequence矩阵连乘
传送门:hdu5667 Sequence题意就是根据求f(n)%p思路:列了一下前几项,然后找了一下规律…… f(1)=(a^b)^0 f(2)=(a^b)^1 f(3)=(a^b)^(1+c*1+0) f(4)=(a^b)^(1+c*(1+c)+1)这样就很容易看出来幂次是有规律的
2017-06-17 19:38:32
269
原创 hdu1299 素因子分解
hdu1299题意:求使不定方程1 / x + 1 / y = 1 / n成立的正整数解。思路:x、y一定是大于n的数,设y=n+k,则1/x=1/(n+k)+1/n,整理一下即x=n^2/k+n,所以只要k是n^2的因子,就一定有解,那么就转化成了n^2的因子个数。直接求n^2的因子个数容易超时,转化成n来做,若n=a1^x1+a2^x2+a3^x3+……(a1,a2,a3……都
2017-06-11 13:36:01
410
转载 求小于n的与n互质的数的和
给出一个N,求1..N中与N互质的数的和ifgcd(n,i)=1 then gcd(n,n-i)=1 (1反证法: 如果存在K!=1使gcd(n,n-i)=k,那么(n-i)%k==0 而n%k=0 那么必须保证i%k=0 k是n的因子,如果i%k=0那么 gcd(n,i)=k,矛盾出现;
2017-05-29 22:13:46
1810
原创 hdu5776
hdu5776#include#include#include#include#includeusing namespace std;int data[100005];int main(){ int t; cin>>t; while(t--) { int n,m; scanf("%d%d",&n,&m);
2017-05-08 16:55:54
417
原创 hdu5747
hdu5747这个题可以想到二进制上,如果m+1>=二进制位数,那么就是二进制各位的和,如果m+1#include #include #includeusing namespace std;int x;int data[30];int main(){ int n,p,q; while(~scanf("%d",&n)) { while
2017-05-08 16:50:38
400
原创 poj2349 Arctic Network 最小生成树
poj2349表示刚开始读题就读了n久没有读明白。。。明白了题意以后这题真真是个套模板的题题意:哨站有两种通信方式:通过卫星和通过建立无线网络,通过卫星可以任意通信,通过无线网络那么距离不能超过D,求这个最小距离D。思路:s代表了可以扔掉s-1条边,p表示点我采用了kruskal算法,在建立好的最小生成树中去掉s-1条边,那么返回上一个的权值w即可。#include#in
2017-05-08 16:30:30
362
原创 hdu1176 免费馅饼(变形数塔)
hdu1176#include#include#include#include#includeusing namespace std;int data[100005][11];int temp[100005][11];int main(){ int n; while(scanf("%d",&n)!=-1) { if(n==0) brea
2017-05-04 16:42:44
251
原创 hdu2084 数塔
hdu2084#include#include#include#include#includeusing namespace std;int data[105][105];int temp[105][105];/*int main()//从上往下{ int t; while(cin>>t) { while(t--) {
2017-05-04 16:01:12
222
原创 poj2533 最长上升子序列 dp
poj2533dp 如果前面的数比这个数小,那么这个数等于前面的数的dp值加一#include#include#include#includeusing namespace std;int data[1005];int temp[1005];int main(){ int n; while(cin>>n) { for(int i=0;
2017-05-03 20:49:30
290
原创 hdu2571命运 DP
hdu2571WA了n次...主要是因为这个题有个 倍数关系,所以dp数组从1开始更好一些...我也没有改...#include#include#include#include#includeusing namespace std;int data[25][1005];int temp[25][1005];int main(){ int n,m; int
2017-05-03 20:23:50
258
原创 hdu1060 Leftmost Digit
hdu1060求n^n的最左边的数设n^n=p.xxx*10^(k-1),其中p即要求的最左边的数,k是n^n的位数两边取对数得n*lg(n)=lg(p.xxx)+(k-1) lg(p.xxx)=n*lg(n)-(k-1) p.xxx=10^(n*lg(n)-(k-1)) 所以p=(in
2017-05-01 18:31:20
392
原创 hdu 1558 Segment set 并查集 叉积判断线段是否相交
hdu1558题意:当输入P的时候,画一条线段,并且线段是有标号顺序的,如果两个线段相交即相当于联通了,当输入Q的时候询问这个与这条线段联通的线段有几条(包括它本身)#include#include#include#include#includeusing namespace std;struct point{ double x; double y;};
2017-05-01 16:26:38
334
原创 poj2081 Recaman's Sequence(简单递推)
poj2081需要把标记数组开大开大开大!#include#include#include#include#includeusing namespace std;const int N=500005;bool temp[10*N];int a[N];int main(){ memset(temp,false,sizeof(temp)); memset(a
2017-04-26 14:17:05
332
原创 hdu2102 A计划 广搜
hdu2102求最小步数,所以用广搜,但本题需要注意可能上下两层都是‘#’,要首先排除。#include #include #include #include #include #include using namespace std;int N,M,T;int ans;struct node{ int x,y,f,step;};char str[2][15][
2017-04-24 19:54:53
361
原创 hdu1051 Wooden sticks (贪心)
hdu1051题目大意:当后面的木棍的长度和宽度都比前面的长时,是不消耗时间的,否则消耗1min时间。基本思路:贪心,可以想象每次一连串的木棍消耗1min,显然,先将木棍的长度和宽度排序(长度优先或者宽度优先结果一样),每个最小的宽度和长度都对应一连串的可以通过的木棍,值得注意的是,每次通过木棍后,都要标记一下,防止下次遍历时再找到。#include#include#inc
2017-04-19 22:07:36
318
原创 hdu1576 扩展欧几里得算法求逆元
hdu 1576(a/b)%MOD就可以化为:( (a%MOD)*_b )%MOD,其中_b就是b%MOD的逆元如果 (b*_b) % MOD == 1的话,那么就称 是 b 的逆元求b关于MOD的逆元就是解这个方程:b*x + MOD*y == 1,求出的x就是b关于MOD的逆元。(令_b=x,那么(b*x)%MOD==1 那么b*x+MOD*y==1,其中y=-(b*
2017-04-01 16:36:14
588
原创 poj1061 扩展欧几里得算法
poj1061青蛙的约会首先要列出关系方程:由于两个青蛙是往同一个方向跳跃的,所以两只青蛙相遇的时候,一定是一只青蛙比另一只青蛙多跳整数圈数。设跳跃的次数为t,圈数为p,那么 (x+mt)-(y+nt)=pl即t(n-m)-pl=x-y此题就是求t的最小正整数解其中n-m、l、x-y已知,所以这是一个有两个未知量的不定方程,那么就要用扩展欧几里得算法。扩展欧几
2017-04-01 16:06:58
346
原创 hdu1061 rightmost digit
hdu1061#include#includeusing namespace std;int main(){ int c; while(~scanf("%d",&c)) { while(c--) { int n,i,b; int a[10][4]={{0},{1},{6,2,4,
2017-03-22 14:31:47
396
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅