摘要:
采用二进制进行集合枚举: 例如可以用二进制表示集合{2,3,6,1,7},二进制第i位对应集合第i个元素,1代表在,0代表不在集合中。上述集合全集为s=111112=31,例如子集A={2,1,7}可以表示为: 100112=25.而B={2,3,6,7}可以表示为:111012=23,.下面利用位 阅读全文
摘要:
/*UVa 12716 - GCD XOR ---gcd(a,b)=c = a xor b,由于异或运算满足a xor c=b,而c是a的约数,可以枚举a,c,枚举a,c可以采用素数筛法类似思想 ---时间复杂度n/1+n/2....+n/n=O(nlogn)。这个时候枚举a,c,用b= a xor c计算出b,然后去判断c是否等于gcd(a,b),考虑 ---到计算最大公约数复杂度O(logn... 阅读全文
摘要:
/*UVa10791 - Minimum Sum LCM ---不难发现,最优情况就是将该数素因子分解 ---需要注意几点: 1)n==1时应该输出2 2)当只有一个素因子或者没有除本身以外的素数因子时,答案等于本身+1 */ #define _CRT_SECURE_NO_DEPRECATE #include #include #include #include using names... 阅读全文
摘要:
/*UVa10375 - Choose and divide --考查素数因子唯一分解定理。将x!分解成素数因子,然后再进行相乘约分。考虑效率问题:组合数公式进行化简: C(m,n)=m*(m-1)*...(m-n+1)/n!来计算. */ #define _CRT_SECURE_NO_DEPRECATE #include #include #include #include using na... 阅读全文
摘要:
/*UVa12169 - Disgruntled Judge --a,b都在10000以内,这样可以枚举a的值,然后根据x1和x3计算出b的值,再遍历数组X判断他们是否合法 --很容易得到x3=(a*a*x1+(a+1)*b)%10001;变形一下可以得到:(a+1)*b+10001*k=x3-a*a*x1;直接利用扩展欧几里得算法 求解b在[0,10000]的唯一解。 */ #define _... 阅读全文
摘要:
/*UVa11582 - Colossal Fibonacci Numbers! ---首先所有数都是对n取模运算的,设F[i]=f(i)%n,则当二元组(F[i],F[i]+1)重复时整个序列就会出现周期循环, ---对n取模可知最多有n种余数,而二元组合最多有n^2种,所以只需要最多打长度为n^2的表就可以找到周期T。 ---需要注意以下几点: 1)n==1时候需要特判,所有数都可以... 阅读全文
摘要:
取模公式: (a+b) mod n=((a mod n)+(b mod n))%n (a-b) mod n=(a mod n -b mod n +n)mod n a*b mod n =(a mod n)*(b mod n)mod n 1大整数取模:输入n,m求n%m,其中n<=10^1000000, 阅读全文
摘要:
定理:对不全为0的数a,b,存在整数x,y使得 ax+by=gcd(a,b) 可使用扩展欧几里得算法来求解x,y 1.求解二元不定方程 ax+by=n 结论:方程有解得充分必要条件是gcd(a,b)|n.若(x0,y0)是方程的一组解,则方程全部解可以表示为:x=x0+b*k,y=y0-a*k, ( 阅读全文
摘要:
/*给出正整数n,m(n #include using namespace std; const int maxn = 10000000+10; bool squre[maxn]; //筛去[n,m]中平方因子数 //线性复杂度的Euler素数筛法构造素数表 bool vis[maxn]; int prime[maxn]; int Euler(int n){ memset(vis, 0,... 阅读全文
摘要:
/*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器,但u的父节点是服务器,则u的所有儿子节点都不是服务器 ---dp[u][2]:u和u的父亲都不是服务器,则u的儿子恰好有一个是服务器 ---状态转移方程: ---dp[u][0]=sum{min(... 阅读全文