上一页 1 2 3 4 5 6 7 ··· 20 下一页
  2012年9月7日
摘要: 题意:有3*n个人,分成n组,每组三个人。给出k个三元组,这三个人不可组队,问最后可以组队的总方案数。当k=0时,有(C[3*n][3]*C[3*n-3][3]*……*C[3][3])/n!种方案,展开以后可以得到dp[n]=(3*n)!/n!/6^n。显然可以写成递推式:dp[n]=dp[n-1]*(3*n-1)*(3*n-2)/2。那么容斥一下,答案=总方案数-至少含一个禁止组合的+至少含两个禁止组合的-……二进制暴力TLE了。DFS的话会有很多剪枝,当前几个已经出现冲突,自然不会再往后面搜了。 1 import java.util.*; 2 import java.math.*; 3 . 阅读全文
posted @ 2012-09-07 12:22 DrunBee 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 题意:有n张卡片,每张上的值可以相同,每张上的值不超过m,第n+1张为m。设k[i]为任意整数,a[i]为第i张卡片的值,那么问∑k[i]*a[i]=1的a[i]有多少种(0<=i<=n)。有式子可得n+1个数线性无关,即最大公约数必然等于1。总数是m^n,只要求得最大公约数不等于1的种数,就能得到答案。先对m分解素因子,例如12,有2,3。是2的倍数的有6个:2 4 8 6 10 12。是3的倍数的有4个:3 6 9 12。是6的倍数的有2个:6 12。所以与12不互质的有6+4-2=8个。import java.util.*;import java.math.*;public 阅读全文
posted @ 2012-09-07 10:04 DrunBee 阅读(534) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个区间,求不能表示成k*x*x*x(x>1)的个数。区间转化为两个1~n,可以先求出能够表示成k*x*x*x(x>1)的个数。不妨假设x是某个素数,1~n中有n/(x^3)个值,x^3,2*x^3,……,n/(x^3)*x^3。假设t不是素数,可以表示t=k*x。那么t^3=(k*x)^3=k^3*x^3。显然会与x统计重复。所以,可以枚举素数的三次方,得到一个答案。但是,6^3=(2^3)*(3^3),被计算了两次。因此,需要用到容斥原理。 1 #include<cstdio> 2 #include<cstring> 3 #include< 阅读全文
posted @ 2012-09-07 09:11 DrunBee 阅读(302) 评论(0) 推荐(0) 编辑
  2012年9月6日
摘要: 题意:取k个不同的数,每个数不超过s,问种数。若kx1,kx2,...,kx3满足条件,则x1,x2,...,x3必然满足条件。因此枚举素数容斥,2*3*5*7>50,所以枚举之多三层。 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #define MAXN 60 5 typedef long long LL; 6 using namespace std; 7 bool p[MAXN]; 8 vector<int> prime; 9 LL C[MAXN][MAXN]; 阅读全文
posted @ 2012-09-06 15:17 DrunBee 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 题意:询问[low,high]中,A集合存在一个数是它的约数,且B集合存在一个数不是它的约数的个数。答案就是满足A条件的个数,减去满足A条件且不满足B条件的个数。 1 #include<cstdio> 2 #include<cmath> 3 #define MAXN 550 4 #define EPS 1e-8 5 typedef long long LL; 6 int n, m, a[MAXN], b[MAXN]; 7 LL low, high, lcm; 8 LL GCD(LL x, LL y) { 9 return y ? GCD(y, x % y) : x;10 阅读全文
posted @ 2012-09-06 14:16 DrunBee 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 题意:x在[a,b]内,y在[c,d]内,求GCD(x,y)=k的个数,题目保证a=c=1。由于GCD(x,y)=k,则GCD(x/k,y/k)=1。那么只要求x在[1,b/k]内,y在[1,d/k]内的互质对数,(x,y)与(y,x)是等价的。剩下的同【HDU】2841 Visible Trees。 1 #include<cstdio> 2 #include<vector> 3 #define MAXN 100010 4 typedef long long LL; 5 using namespace std; 6 vector<int> fac[MAXN] 阅读全文
posted @ 2012-09-06 12:59 DrunBee 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 题意:n*m的格子,每个格子都种有一树,左下角坐标为(1,1)。问在(0,0)最多看到多少树。显然,若(x,y)能被看到,那么(k*x,k*y),其中k>1都不能被看到。因此,问题转化为求1<=x<=n且1<=y<=m有多个<x,y>满足gcd(x,y)=1。那么可以从1~n枚举x,累计1~m中与x互质的个数。对x分解素因子,容斥一下就好了。 1 #include<cstdio> 2 #include<vector> 3 #define MAXN 100010 4 typedef long long LL; 5 using na 阅读全文
posted @ 2012-09-06 10:55 DrunBee 阅读(546) 评论(0) 推荐(0) 编辑
  2012年9月5日
摘要: 题意:同【HDU】1796 How many integers can you find。 1 #include<cstdio> 2 #include<algorithm> 3 typedef long long LL; 4 #define MAXN 110 5 using namespace std; 6 int m; 7 LL n, ans; 8 int a[MAXN]; 9 LL GCD(LL x, LL y) {10 return y ? GCD(y, x % y) : x;11 }12 LL LCM(LL x, LL y) {13 return x / GCD 阅读全文
posted @ 2012-09-05 22:46 DrunBee 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 题意:给出n和m个元素的集合,求小于n且是集合中任意元素的倍数的数有多少个(m<=10)。最基础的容斥了,懒得DFS,直接枚举二进制暴力完事。 1 #include<cstdio> 2 #include<algorithm> 3 typedef long long LL; 4 #define MAXN 110 5 using namespace std; 6 int n, m, ans; 7 int a[MAXN]; 8 LL GCD(LL x, LL y) { 9 return y ? GCD(y, x % y) : x;10 }11 LL LCM(LL x, 阅读全文
posted @ 2012-09-05 22:41 DrunBee 阅读(668) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K>1)的数。我们可以由n^(1/p),知道指数为p的有多少个数。通过观察,可以发现若一个数可以表示成x^(k*t),则可以表示成(x^k)^t。因此指数必然为素数。枚举素数便可以得到指数为p的个数,但是可能出现重复,例如:x^3=y^5,其中x=t^5,y=t^3。运用容斥原理,设a[i]表示指数为第i个素数的个数,那么答案等于满足一个的,减去两个的,加上三个的……由于2^60>10^18,2*3*5*7>60,所以只要枚举到三即可。 1 #include<cstdio> 2 #include&l 阅读全文
posted @ 2012-09-05 21:32 DrunBee 阅读(1060) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 20 下一页