随笔分类 -  数学 数学技巧/思维题

摘要:【算法】数学 【题意】a数组初始为0,t=1~n,每次01翻转t的倍数,最终为0的数字定义为好数,求好数个数 【题解】一个数字为好数的条件是翻转偶数次,也即一个数是好数当且仅当有偶数个因子时。 因子都是两两配对的,只有完全平方数才拥有奇数个因子。 对于n以内的数字,1~√n的平方就是所有完全平方数。 阅读全文
posted @ 2017-08-29 18:10 ONION_CYC 阅读(234) 评论(0) 推荐(0)
摘要:第一题 模拟送分。 #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using namespace std; int read() 阅读全文
posted @ 2017-08-21 12:00 ONION_CYC 阅读(361) 评论(0) 推荐(0)
摘要:【算法】数学+堆 【题意】给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序。 【题解】 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前序列的奇数位置,p2在当前序列的偶数位置且位于p1之后。满足条件的情况下每次找最小。 每次找到p1和 阅读全文
posted @ 2017-08-14 06:54 ONION_CYC 阅读(408) 评论(0) 推荐(1)
摘要:【算法】数论,二分图最大匹配 【题意】有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下。 【题解】 1.定义bi,当ai和ai-1的朝向相同时,bi=0,否则bi=1。特别的,a0朝向下。 则问题转化 阅读全文
posted @ 2017-08-13 09:03 ONION_CYC 阅读(528) 评论(0) 推荐(2)
摘要:【题意】求DAG上最多的点使得互不可达。 【算法】floyd+最大匹配 【题解】 链是DAG上的一个点集,集合内的点相互单向可达。 反链是DAG上的一个点集,集合内的点相互不可达。 题目显然是求最长反链,转化为最小链覆盖。 最小链覆盖只要求可达,最小路径覆盖却要求相连。 所以floyd传递闭包(用f 阅读全文
posted @ 2017-08-12 19:19 ONION_CYC 阅读(440) 评论(1) 推荐(0)
摘要:【关键字】偏序,数点,树状数组,线段树,扫描线。 因为涉及多种算法,所以整合到一起。 【扫描线】 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 扫描线是一维离线的做法的统称,常用于解决k维偏序问题。 离线:将其中一维的询问排序后按顺序处理,从而实现按时间顺序处理的过程中可以O(1)统计空间上 阅读全文
posted @ 2017-08-12 11:11 ONION_CYC 阅读(1012) 评论(0) 推荐(1)
摘要:【题意】抽象模型后转化为:给定n个直线,ans+=C(x,4)*8,x为每个经过直线数>=4的点的直线数,不存在平行直线。 【算法】数学 【题解】 运用了一个很简单的道理:经过同一个点的线段互相相交。 O(n^3),枚举直线i和j相交,然后枚举后面直线判断是否过交点的条数x,将C(x,2)累加入答案 阅读全文
posted @ 2017-08-11 16:50 ONION_CYC 阅读(216) 评论(0) 推荐(0)
摘要:【题意】给定长度为n的序列A,求最长的区间满足区间内存在数字能整除区间所有数字,同时求所有方案。n<=5*10^5,Ai<2^31。 【算法】数论??? 【题解】首先一个区间的基准数一定是最小的数字。 以一个数字为基准数,左右扩展到的区间内的数字都不能再作为基准数(不会超过此时的区间,为同一个)。 阅读全文
posted @ 2017-08-10 16:38 ONION_CYC 阅读(154) 评论(0) 推荐(0)
摘要:【算法】trie树+xor路径 【题解】 套路1:统计从根到每个点的xor路径和,由于xor的自反性,两个点到根的xor路径和异或起来就得到两点间路径和。 然后问题就是找到n个值中异或值最大的两个值,考虑枚举每个数字,对于一个数找到与其异或和最大的数。 套路2:对所有数值二进制建01-trie,对于 阅读全文
posted @ 2017-08-09 19:31 ONION_CYC 阅读(241) 评论(0) 推荐(0)
摘要:【算法】DP+数学计数 【题意】给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边。 2.不存在三个点a,b,c使三个点间两两可以互相到达且两两之间最短距离相等。 3.边的长度均为1。 n<=20 阅读全文
posted @ 2017-08-07 16:56 ONION_CYC 阅读(271) 评论(0) 推荐(0)
摘要:第一题 题意:n个点,每个点坐标pi属性ai,从右往左将遇到的点向左ai范围内的点消除,后继续扫描。 现可以在扫描开始前提前消除从右往左任意点,问最少消除数(提前+扫描)。 n,pi,ai<=10^6 题解:很蠢的DP,我好蠢啊…… f[i]表示前i个的最少消除数(不含提前) 从左往右添加,每添加一 阅读全文
posted @ 2017-08-04 11:23 ONION_CYC 阅读(222) 评论(0) 推荐(0)
摘要:【算法】博弈论+数论 【题意】给定n个石子,两人轮流操作,规则如下: 轮到先手操作时:若石子数<p添加p个石子,否则拿走p的倍数个石子。记为属性p。 轮到后手操作时:若石子数<q添加q个石子,否则拿走q的倍数个石子。记为属性q。 拿走所有石子的人胜利,问先手是否必胜,或输出游戏会永远进行下去。 【题 阅读全文
posted @ 2017-07-28 12:04 ONION_CYC 阅读(319) 评论(0) 推荐(0)
摘要:【算法】数学 【题解】 1.平均数:累加前缀和。//听说要向下取整? 2.中位数:双堆法,大于中位数存入小顶堆,小于中位数存入大顶堆,保证小顶堆内数字数量≥大顶堆,奇数则取小堆顶,偶数则取两堆顶/2。 3.方差=(平方的均值)-(均值的平方),即对于a,b,c,s2=(a2+b2+c2)/3-((a 阅读全文
posted @ 2017-06-20 13:10 ONION_CYC 阅读(344) 评论(0) 推荐(0)
摘要:【算法】数学 【题解】斯特林公式: #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const double pi=3.1415926535898,e=2.718281828459; int main 阅读全文
posted @ 2017-06-06 20:43 ONION_CYC 阅读(476) 评论(0) 推荐(1)
摘要:【算法】数学 【题解】n!的位数相当于ans=log10(n!)上取整,然后就可以拆出来加了。 可以用log10(i)或log(i)/log(10) 阶乘好像有个斯特林公式…… #include<cstdio> #include<cmath> using namespace std; int mai 阅读全文
posted @ 2017-05-29 22:20 ONION_CYC 阅读(276) 评论(0) 推荐(0)
摘要:【算法】快速幂运算 【题解】快速幂的原理是把幂用二进制表示,从最低位a,次低位a2,次次低位(a2)2。 #include<cstdio> long long quick_pow(long long a,long long b,long long c) { long long ans=1; whil 阅读全文
posted @ 2017-05-28 18:37 ONION_CYC 阅读(239) 评论(0) 推荐(0)
摘要:【算法】欧几里德算法 #include<cstdio> int gcd(int a,int b) {return b==0?a:gcd(b,a%b);} int main() { int a,b; scanf("%d%d",&a,&b); printf("%lld",1ll*a*b/gcd(a,b) 阅读全文
posted @ 2017-05-26 19:05 ONION_CYC 阅读(186) 评论(0) 推荐(0)
摘要:【算法】欧几里德算法 #include<cstdio> int gcd(int a,int b) {return b==0?a:gcd(b,a%b);} int main() { int a,b; scanf("%d%d",&a,&b); printf("%d",gcd(a,b)); return 阅读全文
posted @ 2017-05-26 19:04 ONION_CYC 阅读(118) 评论(0) 推荐(0)
摘要:【算法】简单数学 【题解】多项式展开:(a*b)%p=(a%p*b%p)%p #include<cstdio> #include<algorithm> #define rep(i,j,k) for(int i=j;i<=k;i++) using namespace std; int n,p; int 阅读全文
posted @ 2017-05-24 19:24 ONION_CYC 阅读(294) 评论(0) 推荐(0)
摘要:【算法】数学 【题解】 其实就是求中位数,奇数个点就是最中间的点,偶数个点就是最中间两个点和它们之间的区域皆可(所以偶数不必取到两点正中央,取两点任意一点即可)。 我们可以想象现在x轴上有n个点,我们设定的目标点在最左边,那么可以算出距离总和ans。 目标点往右移动1,相当于ans+左边点数-右边点 阅读全文
posted @ 2017-01-18 11:04 ONION_CYC 阅读(380) 评论(0) 推荐(0)