随笔分类 -  组合数学

摘要:简单数学题,推出结果后直接计算即可不取double 会wrongView Code #include<cstdio>#include<cstring>__int64 C(__int64 n, __int64 m){ __int64 s = 1; int i, j; for (i=1,j=n; i<=m; i++, j--) s = s * j / i; return s;}int main(){ int n,s; int i,j,k; while(scanf("%d%d",&n,&s)!=EOF) { double sum=0, 阅读全文
posted @ 2012-03-16 16:40 Because Of You 阅读(266) 评论(0) 推荐(0)
摘要:其实这道题目的难点不在容斥原理,在于大数越界、取余等等的细节首先求出通项公式为n(2n+1)(n+1)(3n² +3n-1)/30求(a/b)%mod有两种方法1、原式=a%(b*n)/b2、原式=a*b^(phi(mod)-1)%mod;(其中b与mod互质)本题中,由于mod过大,采用第一种方法会出错,于是用了第二种方法。容斥过程中比如要加上2的四次,4的四次,6的四次。。。。可把2的四次提取出来,另外一项就变成了四次方和了View Code #include<cstdio>#include<cstring>#include<cmath>#in 阅读全文
posted @ 2012-02-26 19:21 Because Of You 阅读(839) 评论(0) 推荐(0)
摘要:View Code #include <iostream>#include <fstream>#include <cstring>#include <cmath>#include<cstdio>using namespace std;long long prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};long long bestSum;long long bestRes;long long N;void work(long long res,long long sum,int 阅读全文
posted @ 2012-02-14 17:41 Because Of You 阅读(188) 评论(0) 推荐(1)
摘要:题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=15&problem=1266&mosmsg=Submission+received+with+ID+9619336题意:求1~n中不能被给定m个数中任意一个数整除的数的个数Sample Input10 22 320 22 4Sample Output310思想:n-(1~n中至少能被m个数中的一个整除的数个数)解法:容斥原理的思想,多减的数要加回去比如第 阅读全文
posted @ 2012-01-05 16:25 Because Of You 阅读(613) 评论(0) 推荐(1)
摘要:二分答案,然后用容斥原理求1-mid中与m互质的个数注意二分的上界View Code #include<stdio.h>#include<vector>using namespace std;int m,n;__int64 solve(int r,__int64 n){ vector<int> p; int i; for(i=2;i*i<=r;i++){ if(r%i==0){ p.push_back(i); while(r%i==0) r/=i; } } if(r>1) p.push_bac... 阅读全文
posted @ 2012-01-05 14:29 Because Of You 阅读(1125) 评论(1) 推荐(0)
摘要:给定n个数,求互质的四元组的个数。逆向思考,先求不互质的四元组的个数,再减掉。举个例子:以2为因子的数有a个,3为因子 的数有b个,6为因子的数有c个,假设有n个数那么互质的四元组个数为C(4,a)+C(4,b)-C(4,c),即如果一个数仅由偶数个素数相乘所得,则减去,由奇数个素数相乘,则加上通用做法View Code #include<cstdio>#include<cstring>#include<cmath>using namespace std;const __int64 maxn=10005;__int64 count[maxn];__int64 阅读全文
posted @ 2012-01-04 22:08 Because Of You 阅读(851) 评论(0) 推荐(1)
摘要:方法:先对n分解质因数,分别记录每个质因数,那么所求区间内与某个质因数不互质的个数就是n / r(i),假设r(i)是r的某个质因子。假设只有三个质因子,总的不互质的个数应该为p1+p2+p3-p1*p2-p1*p3-p2*p3+p1*p2*p3,及容斥原理,可以转向百度百科查看相关内容pi代表n/r(i),即与某个质因子不互质的数的个数当有更多个质因子的时候,可以用状态压缩解决,二进制位上是1表示这个质因子被取进去了。如果有奇数个1,就相加,反之则相减View Code #include<vector>#include<cstdio>using namespace s 阅读全文
posted @ 2012-01-03 12:31 Because Of You 阅读(1652) 评论(0) 推荐(0)
摘要:同 上一题,错了两次,原因:100000*100000会超intView Code 1 #include<stdio.h> 2 #include<string.h> 3 typedef __int64 lld; 4 lld sum[100010]; 5 int mod[100010]; 6 int re[100010]; 7 int num[100010]; 8 inline bool dig(char x){return x>='0'&&x<='9';} 9 int get_val()10 {11 int r 阅读全文
posted @ 2011-10-30 16:28 Because Of You 阅读(302) 评论(0) 推荐(0)
摘要:抽屉原理。。早就知道了,只是没有切过题,今天碰上了一道,果断刷掉其实n个数一定可以找出一些数或某个数的和能被n整除取sum[i]为前i个数的和,对n取余。n个数对n取余,下面两个结论必有一个成立:有两个余数是相等的,有一个余数是1其中任何一个结论的成立都表示存在一些数的和能被n整除View Code 1 #include<stdio.h> 2 #include<string.h> 3 int sum[10010]; 4 int mod[10010]; 5 int re[10010]; 6 int num[10010]; 7 int main() 8 { 9 int n, 阅读全文
posted @ 2011-10-30 16:07 Because Of You 阅读(324) 评论(0) 推荐(0)
摘要:题目数据较小,直接枚举自己和敌人的所有全排列,暴力水之(讨论出做法后,队友写的)View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n;int id1[10],id2[10];struct node{ char s[25];}p[10];int map[10][10];int cmp(node a,node b){ return strcmp(a.s,b.s)<0;}void init(){ for(int i=0;i<n; 阅读全文
posted @ 2011-10-07 20:23 Because Of You 阅读(252) 评论(0) 推荐(0)
摘要:__int64 C(__int64 n, __int64 m){__int64 s = 1;int i, j;for (i=1,j=n; i<=m; i++, j--)s = s * j / i;return s;}void init(){ for(int i=0;i<maxn;i++){ c[i][0]=1; c[i][i]=1; for(int j=1;j<i;j++) c[i][j]=c[i-1][j-1]+c[i-1][j]; }} 阅读全文
posted @ 2011-10-06 21:52 Because Of You 阅读(238) 评论(0) 推荐(0)