数学
HumveeA6
这个作者很懒,什么都没留下…
展开
-
快速乘法(模板)
由于计算机底层设计的原因,做加法往往比乘法快的多,因此将乘法转换为加法计算将会大大提高(大数,比较小的数也没必要)乘法运算的速度,除此之外,当我们计算a*b%mod的时候,往往较大的数计算a*b会超出long long int的范围,这个时候使用快速乘法方法也能解决上述问题. 快速乘法的原理就是利用乘法分配率来将a*b转化为多个式子相加的形式求解(注意这时使用乘法分配率的时候后面的一个乘...原创 2018-02-09 11:47:19 · 548 阅读 · 0 评论 -
CF473 DIV2 D. Mahmoud and Ehab and another array construction task
本题基于一种贪心的思路,即:能不改就不改,但是一旦改了以后,后面的都改;具体而言,就是从前往后扫,如果当前位置的数不与前面的数冲突的话,那么我们就不改动他。但是,一旦有一个数冲突了,根据题意我们肯定要换一个更大的数,那么此时整个序列肯定就比原序列大了,那么后面的数我们肯定都要换尽可能小的。 同时,还要考虑的一个问题是,如何保证后面选的数不与前面已经选过的数冲突。方法非常暴力:我们预处理出每个数的...原创 2018-04-04 16:36:19 · 370 阅读 · 0 评论 -
(模板)求乘法逆元
1.扩展欧几里得求乘法逆元 原理就是解线性同余方程;void exgcd (ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return ; } exgcd (b, a % b, x, y); ll tmp = x; x ...原创 2018-04-10 09:53:32 · 654 阅读 · 0 评论 -
cccc2016决赛9
刚看到题并不知道怎么做,想了一会感觉似乎网络流可以搞,乱写了一通交上去然后发现tle了60%的点然后滚粗了。然后发现这题其实是在求在整个数列中最多有多少个下降的子序列,那么就可以用到dilworth定理的推论了:一个序列中不上升子序列的最小覆盖数=序列中最长上升序列的长度。那么剩下的就是一个onlogn的问题了。#include<cstdio>#include<iost...原创 2018-03-21 10:37:25 · 314 阅读 · 0 评论 -
26进制乘法(模拟高精度)
题意:给你俩26进制数(a对应0,b对应1…),求乘积 比赛的时候我的第一想法是把两个数都变成10进制,然后直接乘,乘出来再转换为10进制…然后就发现爆了unsigned long long….一脸懵逼。后来机智地发现GCC的__int128可以水过去…然后就没有然后了… 不过,要是数据再大一点估计就GG了,所以还是要了解一下正解…其实也不难,就是模拟一下高精度算法就行了….#incl...原创 2018-03-18 16:52:29 · 331 阅读 · 0 评论 -
洛谷P1338 末日的传说
QAQ本来不是多难的题,然鹅我折腾了半天。看到一个挺不错的想法; 我们知道,对于一个长度为n的序列而言,其最大的逆序对的个数为n*(n-1)/2,题目是要求一个逆序数为m的字典序最小的序列。那我们不妨从1开始考虑每一个数的排列,这样每次考虑的都是当前最小的数 如果把这个数放在最前面,而剩下的数的排列的逆序数仍然可以达到m的话,那么一定要把当前考虑的这个最小的数放在最前面,这一定是最优解。即(n...原创 2018-03-03 09:13:17 · 295 阅读 · 0 评论 -
线性同余方程(模板)
#include<cstdio>#include<iostream>#include<cmath>using namespace std;typedef long long ll;ll extgcd(ll a,ll b,ll&x,ll&y){ if(b==0){ x=1,y=0;return a; ...原创 2018-02-17 15:33:57 · 642 阅读 · 0 评论 -
POJ1845(数论)
题意即求A得B次方的所有约数之和mod9901 很重要的一点是9901是质数… 因为9901是质数,所以乘法逆元就是分母的mod-2,也就是9899次方,用快速幂可求。 代码中要注意longlong的问题…很容易爆#include<cstdio>#include<iostream>#include<cstring>using namespac...原创 2018-02-17 11:41:27 · 300 阅读 · 0 评论 -
质数筛选(模板)
埃拉托斯特尼筛法:#include<cstdio>#include<iostream>using namespace std;bool notprime[10000005];void checkprime(int n){ for(int i=2;i<=n;i++){//注意线性筛法做完以后1是没有被标记的... if(notp...原创 2018-02-13 14:04:36 · 152 阅读 · 0 评论 -
欧拉函数(模板)
1~n中与n互质的数的个数称为欧拉函数,证明如下:实现如下:int eular(int x){ int res = x, a = x; for (int i = 2; i*i <= a; i++) { if (a%i == 0) { res = res / i*(i - 1); while (a%i...原创 2018-02-14 16:49:58 · 300 阅读 · 0 评论 -
Codeforces 891A(Maths)
题意:有n个数,每次取两个相邻的数字x和y把其中的一个值x或者y改变成gcd(x,y),求把这所有的n个数都变成1的最少次数。 思路:很明显的一点是,如果这n个数中存在一个1的话,那么我们只需n-1次就可以把所有的n个数都变成1啦,所以这道题目就可以转变为求出使得n个数中至少存在一个1的最小步骤。 注意要特判有1的情况…#include#include#includeusing na原创 2018-02-07 20:21:28 · 231 阅读 · 0 评论 -
Strange Counter(maths)
https://www.hackerrank.com/contests/hourrank-11/challenges/strange-code 原题不难,读懂题意即可,不过我自己原来的做法比较暴力,疯狂tle…看到正解以后感动得掉下了眼泪…#include#include#includeusing namespace std;int main(){ long long原创 2018-02-07 18:22:53 · 301 阅读 · 0 评论 -
洛谷P1463 (HAOI2007,反质数)
题目有三个值得注意的地方: 1.1~n中最大的反质数,就是1~n中约数个数最多的数中最小的一个 2.1~n中任何数的不同质因数个数不会超过10(最小的11个质数乘积大于n),并且幂次方总和不会大于30(2的31次方大于n) 3.满足条件的x的质因子必然是连续的若干个最小的质数,并且指数单调递减 其余的可见进阶指南p134#include<cstdio>#include&l...原创 2018-02-13 17:31:54 · 234 阅读 · 0 评论 -
欧几里得算法(模板)
GCD(欧几里得算法)#include<cstdio>#include<iostream>using namespace std;int gcd(int a,int b){ return b?gcd(b,a%b):a;}int main(){ int x,y; cin>>x>>y; cout<...原创 2018-02-13 11:17:52 · 341 阅读 · 0 评论 -
快速幂(模板)
对于任何一个整数的模幂运算 a^b%c 对于b我们可以拆成二进制的形式 b=b0+b1*2+b2*2^2+…+bn*2^n 这里我们的b0对应的是b二进制的第一位 那么我们的a^b运算就可以拆解成 a^b0*a^b1*2*…*a^(bn*2^n) 对于b来说,二进制位不是0就是1,那么对于bx为0的项我们的计算结果是1就不用考虑了,我们真正想要的其实是b的非0二进制位 那么假设...原创 2018-02-09 12:06:30 · 213 阅读 · 0 评论 -
Codeforces Round #475 (Div. 2) C
这题做起来感觉挺坑的。。。大概是不习惯这种数学题吧,也可能是这次前两题太简单了? anyway,首先如果暴力去算每一个数的值肯定是tle的,注意到这是以k为周期的,那么我们其实可以先算出前k个数的和,然后对于后面的数,每k个一组,每组的和都是上一组的和*(a^k/b^k),这里要求一波乘法逆元。1e9+9是质数所以费马小定理搞一下就行。然后这些和怎么加呢?如果一个个去加也是会tle的…所以就祭出...原创 2018-04-23 23:36:55 · 154 阅读 · 0 评论