随笔分类 -  算法--数论/组合数学/计算几何

摘要:有点无聊,AC水题玩..... 这道题的大致意思: 圆表示一块面积可扩展的区域,开始时,面积是0,在(0,0)处开始以每年50平方米的速度同样呈半圆扩展,输入一个正整数N,然后输入N对坐标,对于每一对坐标值:求出面积扩展到该点的年数,坐标值单位为米。 则年份数为, Pi*( sqrt(x*x+y*y) )^2 / (50*2) 向上取整View Code #include<stdio.h>#include<math.h>const double Pi = 3.1415926;int main(){ int T; scanf("%d",&T); 阅读全文
posted @ 2013-01-04 16:31 yefeng1627 阅读(192) 评论(0) 推荐(0)
摘要:若置换循环因子阶数分别为 ( a1, a2, ..., ak ) , 则最少交换次数为 (a1-1)+(a2-1)+...+(ak-1)解题代码View Code #include<stdio.h>#include<string.h>#include<stdlib.h>const int N = 10010;int a[N], n;bool vis[N];int check( int s ){ for(int i = s; i <= n; i++) if( !vis[i] ) return i; return -1;}int main(){ int T 阅读全文
posted @ 2013-01-04 15:00 yefeng1627 阅读(155) 评论(0) 推荐(0)
摘要:根据题意,N个编号祭祀,N个房间,每个转盘上有P个数字,且每年保证每个房间有且仅有一个祭祀。 可以转换成 P 个不同的 N元组置换。 其中 为第i天祭祀位置,为第 i 天转盘置换 则 第i天 祭祀所在的房间为 (为什么是先D后T,因为置换的乘法是连接,先后) 题目要求 经过 Y天,得到单位置换, 且总共P个不同的置换所以我们可以得到如下形式: (其中 e 为单位置换) 假设 Y mod p = k , 则可表示成如下形式: 再转换一下: 令 x = (y - k )/ p , , 得到 上式转换成: 对于 , 我们通过预处理得出,然后枚... 阅读全文
posted @ 2013-01-04 14:35 yefeng1627 阅读(310) 评论(0) 推荐(0)
摘要:输入 A , B, C, k 设 D = 2^k 则存在 ( x, y ) 使 A + C*x = B ( mod D ) => A + C*x = B + D*y => C*x - D*y = B - A 令 a = C, b = D, c = B-A 则转换成线性同余方程 : a * x + b * y = c 使用扩展欧基里德求解即可解题代码View Code #include<stdio.h>typedef long long LL;LL ExGcd( LL a, LL b, LL &x, LL &y ){ if( b == 0 ){ x... 阅读全文
posted @ 2013-01-03 14:59 yefeng1627 阅读(166) 评论(0) 推荐(0)
摘要:给定同余方程组 X = r1 ( mod a1 ) X = r2 ( mod a2 ) ... X = rn ( mod an )求解正整数X, 若不存在输出 -1关于 线性同余方程组求解, 看笔者前一篇博客关于求解方式,模板裸题#include<stdio.h>typedef long long LL;LL ExGcd( LL a, LL b, LL &x, LL &y ){ if( b == 0 ) { x=1;y=0; return a; } LL r = ExGcd( b, a%b, x, y ); LL t = x; x = y; y = t - a/b. 阅读全文
posted @ 2013-01-03 14:40 yefeng1627 阅读(301) 评论(0) 推荐(0)
摘要:欧拉函数直接计算公式 欧拉函数的定义: E(N)= ( 区间[1,N-1] 中与 N 互质的整数个数). 对于 积性函数 F(X*Y),当且仅当 GCD(X,Y)= 1 时, F(X*Y) = F(X)* F(Y) 任意整数可因式分解为如下形式: 其中( p1, p2 ... pk 为质数, ei 为次数 ) 所以 因为 欧拉函数 E(X)为积性函数, 所以 对于 , 我们知道 因为pi 为质数,所以 [ 1, pi-1 ] 区间的数都与 pi 互质 对于 区间[ 1, ] ,共有个数, 因为只有一个质因子, 所以与约数大于1 的必定包含 质因子 ... 阅读全文
posted @ 2013-01-02 21:58 yefeng1627 阅读(4484) 评论(0) 推荐(2)
摘要:问题:模线性同余方程组: x = a1 ( mod n1 ) x = a2 ( mod n2 ) .... x = ak ( mod nk )给定 A ( a1, a2 , ... , ak ) , N ( n1, n2, ..., nk ) 求 X 。通常分为两种 一, ( Ni, Nj ) 之间两两互质 二, ( Ni, Nj ) 之间不都互质一 ( Ni, Nj ) 之间两两互质 定理( 见算法导论 P874 ): 如果 n1, n2 , ... , nk 两两互质, n = n1*n2*..*nk ,则对任意整数 a1,a2,a3..,ak , 方程组 x =... 阅读全文
posted @ 2012-12-31 22:26 yefeng1627 阅读(2162) 评论(1) 推荐(1)
摘要:没看到题目上说 仅一个循环因子.. 现在我还是没看到.....WA了好久, 一直用 置换群分解循环因子后,对每一个循环因子 其 阶数即为循环节. 之后无限WA..找了好久.才发现. 这里的置换, 每一次 double shuffer 后. 其循环因子顺序已经改变了. 我们使用循环因子的顺序是相对于最初的情况而言.所以这里不能够用循环因子来做.模拟其置换过程,找出其 置换循环 D, 对于置换X经过S次置换后得到Y, 则 Y再经过 D-S%D 次置换后又回到 X.View Code #include<stdio.h>#include<stdlib.h>#include< 阅读全文
posted @ 2012-12-31 11:15 yefeng1627 阅读(210) 评论(0) 推荐(0)
摘要:对于每个 Block 求出其 循环因子,我这里是用 Vector 动态数组,省事 循环因子顾名思义就是置换会出现循环. 这样把时间复杂度降下来. 因为串总长才 200 , 分别处理每一个循环因子. 可以选择一个一个移动模拟, 也可以一次到位. 我都试了下,都是700+Ms. 虽然区别不大, 估计是数据问题吧. 数据量大了肯定影响很大.View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#i 阅读全文
posted @ 2012-12-30 15:40 yefeng1627 阅读(122) 评论(0) 推荐(0)
摘要:总共共10^5个数,取值在10^6之内 离散化后与下标形成映射,转换成置换群 然后就可以形成: 有 n = 10^5 个位置, 每个位置有一头编号为 a[i] (取值范围为[1,n] ) 的牛, 其愤怒值为 dep[ a[i] ] 对于置换群求出其循环因子后. 因为置换的权值花费为 dep[i], dep[j] 所以我们取最小的 dep, 例如循环因子 ( 1 , 4, 7, 8 ) 需要三次置换 , 我们可以取最小的 1, 其愤怒值为 dep[1] ( 我们按权值递增离散化过) 所以三次置换分别为 ( 1, 4 ) ( 1, 7 ) ( 1, 8 ) 则三次花费为 ( de... 阅读全文
posted @ 2012-12-30 12:52 yefeng1627 阅读(166) 评论(0) 推荐(0)
摘要:题目大意: 对于方程 输入 k ( 0 <= k <= 20 ) 输出 解题思路: 由数学 伯努利数 公式: 带入通分化简就可以了,不过要注意,分母为正...( WA了一小时错在了这里 ) 伯努利数是18世纪瑞士数学家雅各布·伯努利引入的一个数。 设伯努利数为B(n),它的定义为: t/(e^t-1)=∑[B(n)*(t^n)/(n!)](n:0->;∞) 这里|t|<2。由计算知: B(0)=1,B⑴=-1/2, B⑵=1/6,B⑶=0, B⑷=-1/30,B⑸=0, B⑹=1/42,B⑺=0, B⑻=-1/30,B⑼=0), B⑽=5/66,B⑾=0, . 阅读全文
posted @ 2012-12-27 17:17 yefeng1627 阅读(415) 评论(0) 推荐(0)
摘要:题目大意: 使用三种颜色珠子串成 一个n颗珠子的项链,项链旋转和翻转相同的视为同样方案,问有多少不同方案数 对于 群论中置换群的计算公式我们有 BurnSide 和 Polya 前者是找所有置换群,后者是找置换群循环因子,其两者公式也相差不远,因为 Polya计数 比较方便,所以通常使用 Polya公式 其中 ei 为第 i 个置换,其循环因子数量 对于 n 角/边对称图形, 其包括 旋转 和 反射 旋转顶点数量为 ( 0, 1, 2 ... n-1 ) : 循环因子数量: Gcd( n, i ) 反射对于 偶数n 时,分为 n/2个顶点反射 与 n/2个边... 阅读全文
posted @ 2012-12-27 12:01 yefeng1627 阅读(225) 评论(0) 推荐(0)
摘要:题目大意: 给出递推公式,求 % 1e9+7 看大神们的思路:除1外,奇数全为0,对于偶数2k,答案为(-1)^k*fact[2k]*catalan(k+1)。p[i]表示i的阶乘。表示弱菜依旧无法理解哪里看出来的规律,哪怕是 catalan(n) 为 阶乘倍数的关系知道我也没弄出来...求大神普渡~~~AC代码:View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;typedef long lon 阅读全文
posted @ 2012-12-26 17:59 yefeng1627 阅读(213) 评论(0) 推荐(0)
摘要:解题思路: 对于置换群 分解其循环因子 对于 需要对换一次,对于 需要对换两次, 所以当前置换群最少对换次数为三 对于 本题, 我们先 求出其 循环因子后,再从小到大 进行贪心即可解题代码:View Code #include<stdio.h>#include<string.h>#include<queue>#include<iostream>#include<algorithm>using namespace std;const int N = 100010;int a[N], b[N], n , k;bool vis[N];int 阅读全文
posted @ 2012-12-26 16:59 yefeng1627 阅读(312) 评论(0) 推荐(0)
摘要:例题是 POJ 1061 青蛙的约会 题目大意是,一个周长为L的圆, A、B两只青蛙,分别位于 x 、y 处,每次分别能跳跃 m 、n ,问最少多少次能够相遇,如若不能输出 “ Impossible” 此题其实就是扩展欧几里德算法-求解不定方程,线性同余方程。 设过 k1 步后两青蛙相遇,则必满足以下等式: ( x + m*k1 ) - ( y + n*k1 ) = k2*L ( k2 =0 , 1 , 2....) //这里的k2: 存在一个整数k2, 使其满足上式 稍微变一下形得: ( m - n )*k1 - k2*L= y - x 令 a = m - ... 阅读全文
posted @ 2012-12-24 10:21 yefeng1627 阅读(1601) 评论(0) 推荐(1)
摘要:解题思路: 对于每一个节点有三个值来唯一标志( L, cur, R ) 分别表示 左上根, 本身, 右上根 对于两种走法: 向左走, 左上根不变, 右上根更新 表达式为: L = L, R = ( L + R ) 向右走, 右上根不变, 左上根更新 表达式为: L = ( L + R ), R = R 当向走或向右走 N 步时, 可得 N*L + R 或 L + N*R 数据过大,需使用64int, 使用按位模拟乘法避免溢出解题代码:View Code #include<stdio.h>const int N = 10000007;const int mod = 1... 阅读全文
posted @ 2012-12-22 19:30 yefeng1627 阅读(196) 评论(0) 推荐(0)
摘要:du熊填数字Time Limit:3000/2000 MS (C/Others) Memory Limit: 65536/32768 K (C/Others)本次组委会推荐使用C、C++Problem Description du熊这几天使劲的往一个n 行n列的矩阵填0和1这两个数字,n为偶数,而且矩阵由里向外分成了n / 2层。比如n = 6时,矩阵的分层如下: du熊填数时有一个要求:不能存在两个相邻的1,且位于不同的层(这里的相邻指两格子共用一条线)。 请你帮du熊计算一下有多少种填法。Input 输入包含多组测试数据,每组数据包含一个偶数n (2 <= n <= 500)。 阅读全文
posted @ 2012-12-11 22:09 yefeng1627 阅读(433) 评论(5) 推荐(0)
摘要:du熊学斐波那契ITime Limit : 2000/1000ms (C/Other)Memory Limit : 65535/32768K (C/Other)本次组委会推荐使用C、C++Problem Descriptiondu熊对数学一直都非常感兴趣。最近在学习斐波那契数列的它,向你展示了一个数字串,它称之为“斐波那契”串:11235813471123581347112358........聪明的你当然一眼就看出了这个串是这么构造的:1.先写下两位在0~9范围内的数字a, b,构成串ab;2.取串最后的两位数字相加,将和写在串的最后面。上面du熊向你展示的串就是取a = b = 1构造出来 阅读全文
posted @ 2012-12-11 22:08 yefeng1627 阅读(296) 评论(0) 推荐(0)

Launch CodeCogs Equation Editor