随笔分类 - ACM题解
摘要:给定一个字符串,问其能通过重新排列生成多少不同的回文串。 显然只需要考虑一边就好了,考虑一边实际上就是多重集的全排列问题。 ll f[505]; void init() { f[0] = 1ll; for (int i = 1; i <= 500; i++) f[i] = f[i - 1] * i
阅读全文
摘要:给出数组A和B问是否相等。 可以用java的bigdecimal 和 string的去末尾0函数实现。 public static void main(String[] args) { Scanner in=new Scanner(System.in); while(in.hasNextBigDec
阅读全文
摘要:可见,可以求出0-10克的重量,且方案数都是1. 此题就是用多项式相乘的原理求幂次和系数。 int c1[130]; int c2[130]; int main() { int n; while (~scanf("%d", &n)) { for (int i = 0; i <= n; i++) c1
阅读全文
摘要:计算所有线段的所有子集的复杂度的和。 复杂度:线段集合的连通块个数。 连通块:不相交的并 考虑每个线段对前 i - 1个线段的贡献,若不选,则复杂度和不变,若选,则不相交的部分会贡献 2 ^ x 的复杂度。 故每次只需计算x的大小,x的大小可以建立前缀和数组来维护。 void Put(ll x) {
阅读全文
摘要:给定两个数A和B,求最小的X,满足:A=X+YB=X xor Yxor 表示位运算的异或 异或是不进位的加法,因此A - B 表示的就是X + Y的进位情况。 由于加法得到的进位情况会是异或的两倍。所有 (A - B) / 2 是X 和 Y 的共同都有的部分。所有X可以认为是(A-B)/2/。 in
阅读全文
摘要:求凸包的面积 const double pi = acos(-1.0); const int maxp = 1010; //`Compares a double to zero` int sgn(double x) { if (fabs(x) < eps)return 0; if (x < 0)re
阅读全文
摘要:给定n个点可以形成一个多边形,按照逆时针的顺序输出这n个点。 考虑用叉乘比较极角 struct Point { int x, y; Point(int _x = 0,int _y = 0): x(_x),y(_y){} Point operator -(const Point& b)const {
阅读全文
摘要:nCr * pq 求该表达式末尾0的个数。 显然至于2 5 的因子个数有关。 考虑预处理出每个数的2,5的因子个数,并统计前缀和(题个的组合数其实是阶乘) int _2[maxn], _5[maxn]; ll _s2[maxn], _s5[maxn]; int _count(int x, int y
阅读全文
摘要:int prime[maxn]; int vis[maxn]; int euler_sieve(int n) { int cnt = 0; vis[1] = 1; for (int i = 2; i <= n; i++) { if (!vis[i]) prime[cnt++] = i; for (i
阅读全文
摘要:在 n×n 的棋盘上放 kk 个国王,国王可攻击相邻的 88 个格子,求使它们无法互相攻击的方案总数。 状压DP是一种比较暴力的DP。 首先dp[i][j][k]表示前i行放置k个国王,且当前行状态是j的方案数。 转移方程 dp[i][j][k] = dp[i - 1][m][k - sum[k]]
阅读全文
摘要:根据斐波那契数列的通项公式可以进行如下推导。 注意到后面是等比数列可以O(1)求出。还要注意的问题是 1 / sqrt(5) 在模意义下处理用二次剩余模板处理出。以及预处理组合数。 当然,直接这样写虽然复杂度上没问题但还会T 考虑以下优化: 1.由于c很大,计算A^c,B^c时用欧拉降幂减少快速幂。
阅读全文
摘要:定理: {an} 是一个p阶等差数列的充要条件是数列的通项 an 为n的一个p次多项式。 题意: 求 这个表达式等价于一个 k + 1 次多项式。因此可以由拉格朗日插值法求得 又由于这里的x是连续的,可以预处理前缀后缀O(n)求得。 ll fac[maxn]; ll pre[maxn]; ll su
阅读全文
摘要:由n + 1 个点可以确定一个n次多项式。 拉格朗日插值法可以在 n^2 复杂度确定一个多项式并进行求解。 模板 ; 给定n 个点,以及k ,求出确定的多项式的 f(k)。 #pragma warning(disable:4996) #include<iostream> #include<algor
阅读全文
摘要:ll w; struct num { ll x, y; }; num mul(num a, num b, ll p) { num ans = { 0,0 }; ans.x = ((a.x * b.x % p + a.y * b.y % p * w % p) % p + p) % p; ans.y =
阅读全文
摘要:巴士博弈变形。 给定n个石头,每次最少选择p个石头,最多选择q个石头。当石头数少于p时必须全选。 最终选择的人输。 考虑一个很好的性质:每一轮两人之和可以达到 p + q。 取s = n % (p + q) 若s == 0 先手只需先拿q个。随后使得和为p + q .总可以使得最后剩下p个让后手拿。
阅读全文
摘要:给定 a ,b ,c , d , x, y 求上式 0⩽a,b,c,d⩽3×106,0<x,y⩽109,a⩽b,c⩽d.首先对问题转化为枚举质因子,计算为每个公共质因子贡献的问题。(由唯一分解定理容易想到)规模为O(log x + log y)乘积就转化成了和的形式 只需求出此式(指数)然后快速幂即
阅读全文
摘要:给定一个数组a。 对数组a进行操作 1.修改a[i] = j 2.对区间 L , R 求每个子区间的异或和。 容易发现若 R - L 为奇数,每个数的贡献是偶数次,答案为0 若不为奇数,则奇偶相同的位数会贡献奇数次,其他贡献偶数次,即 al ^ al+2 ^ al+4 .....ar 可以用树状数组
阅读全文
摘要:工具需要检测的号码特征有两个:号码中要出现至少 33 个相邻的相同数字;号码中不能同时出现 88 和 44。号码必须同时包含两个特征才满足条件。满足条件的号码例如:13000988721、23333333333、14444101000。而不满足条件的号码例如:1015400080、100100120
阅读全文
摘要:题意:问给定的矩阵中形如绿色的块的个数。 红色是不合法的。第一个红没有全是同样的字母。第二个红越界。第三个红不是斜的45度 对矩形预处理。l[i][j]表示(i , j) 最大向上延伸的长度,其他同理。 mid[i][j] 表示这个点左右延申的最大长度。 用u[i][j]表示向上形成三角形的个数。
阅读全文
摘要:给定n条链,每条链中有若干个数字 选出其中的m条,从每条中选出一个数,问能够得到的最小的最大差值。 如果能选,每次都贪心的选择差最小的一对。那么不妨对原先的数都排一遍序放到容器里。然后相当于必须找到m个不同的才能选取。 由于每次枚举L都是最多一个m发生变化。所以复杂度是没问题的。 vector<pi
阅读全文

浙公网安备 33010602011771号