cstring

欧拉函数(汇总&例题)

只愿长相守 提交于 2020-05-01 05:16:13
定义 欧拉函数 $\varphi(n)$表示小于等于$n$的正整数中与$n$互质的数的数目。 性质 1、积性函数( 证明 )。 2、$\varphi(1)=1$(显然) 3、对于质数$n$,$\varphi(n)=n-1$(显然) 4、对于质数的幂$n=p^k$(其中$p$为质数,$k$为正整数),$\varphi(n)=p^{k-1}\cdot(p-1)$ 证明: 归纳法,在$k=1$时显然成立,假设当$k$为$k-1$时成立,那么对于将$1,2,...p^k$中每一个数表示为$x\cdot p^{k-1}+d$,其中$0\leq x<p$,$1\leq d\leq p^{k-1}$,若某一个数对$\varphi(n=p^k)$有贡献,则其$d$的部分一定不含质因子$p$,因而一定对$\varphi(p^{k-1})$有贡献,所以,恰好每一个对$\varphi(p^{k-1})$ 有贡献的数都会对$\varphi(p^k)$有$p$次贡献,所以有$\varphi(p^k)= \varphi(p^{k-1}) \times p=p^{k-2}\times (p-1)\times p=p^{k-1}\times (p-1)$,得证。 计算 不妨设 $n=\prod p_i^{t_i}$ ,其中 $p_i$ 是质数, $t_i$ 为正整数。 则有 $\varphi(n)=n \prod

2018年全国多校算法寒假训练营练习比赛(第五场)题解

十年热恋 提交于 2020-05-01 05:00:40
【 题目链接 】 A - 逆序数 经典问题,有很多方法,例如树状数组,线段树,归并排序、分治等。代码不贴了。 B - Big Water Problem 单点修改求区间和,树状数组或者线段树都可以。 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; long long c[maxn]; int lowbit(int x) { return x & (-x); } long long sum(int p) { long long res = 0; while(p) { res += c[p]; p -= lowbit(p); } return res; } void update(int x, long long y) { while(x < maxn) { c[x] += y; x += lowbit(x); } } int main() { int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++) { long long x; scanf("%lld", &x); update(i, x); } while(m --) { int op; scanf("%d", &op); if(op == 1) { int x;

【2018年全国多校算法寒假训练营练习比赛(第四场)】

荒凉一梦 提交于 2020-05-01 04:59:02
上一场自己状态爆表;这一场队友爆表,自己捡表了;题目呢,总的来说不难,相比于前面几场比赛来说,关键在于如何建图。 像D题,在我的上一个博客里面就是一道同理的题,只需要求入度为0和出度为0的点最大数,然后特判已经强连通(比如只有一个点)的情况。 可以看看我上一个博客,可能会对此比赛有帮助。 【A 石油采集】 题解:二分匹配之匈牙利。 【B 道路建设】 题解:并查集。 【C 求交集】 题解:双指针扫一遍即可。 【D 小明的挖矿之旅】 题解:求度为0的点数量。 【E 通知小弟】 题解:处理入度为0的新点; 【F Call to your teacher】 题解:水 【G 老子的意大利炮呢】 题解:分层+优先队列SPFA。 【H 老子的全排列呢】 题解:STL之permutation或者试一试康拓展开。 -------------------------------代码----------------------------- 【A】 12月份刚好看过队友做过此题,当然那个题我还懵b了,所以记得。 可以先去看看POJ 2446 ,POJ3020。附上队友博客: LZH #include<iostream> #include <cstdio> #include <cstring> #include <ctime> #include <cstdlib> #include <algorithm>

【2018年全国多校算法寒假训练营练习比赛(第三场)】

放肆的年华 提交于 2020-05-01 04:18:51
之前题目比较水,今天的还可以。 【A 不凡的大夫】 方法一:答案是log8(n!),解决方案是预处理,将需要的答案记录下来以免超内存; 方法二:用公式,斯特林公式: 【B 一个小问题】 题解:线性同余方程组,一看就不是中国剩余定理,当心。 【C 守护白起】 题解:polya。。。。。比赛的时候忘记加逆元。。。mmp,然后WA了,后面来不及了。 【D 小牛vs小客】 题解:对称博弈,做过不久,先考虑特殊情况,再考虑对称性。 【E 进击吧!阶乘】 题解:高精度裸题,py可以直接码。 【F 小牛再战】 题解:博弈,好像和奇偶有关。 【G 大水题】 题解:简单容斥定理。 【H 向左走】 一眼不会题。。。。。。。 【I 三角形】 题解:面积可以用海伦公式或者向量法,(自己习惯向量法);GCD求线段上整点;皮克定理求内部整点。 --------------------------------------------------分界线-------------------------------------------------------------- 对于一个数学不好的人(队伍)来说,这次是敲响了警钟。! 上面的东西会尽快补齐的。 【A】预处理: #include<iostream> #include <cstdio> #include <cstring> #include <ctime>

2019黑龙江省大学生程序设计竞赛 赛后总结

杀马特。学长 韩版系。学妹 提交于 2020-04-30 16:21:06
赛后总结:   T:今天比赛彭彭和金姐又来晚了。╭(╯^╰)╮然后我从最后开始看,最后一题又是熟悉的序列交换成有序数列,然后套一下我们的模板,然后就拿到首A了。接着跟榜看A题,花了几分钟搞一搞,然后因为爆int挖了一发,痛苦,以后要仔细看数据范围啊。然后金姐和彭彭看了E题做出来了,然后金姐看H题,听隔壁队伍口胡了快半小时。。。笑死我了。然后比他们先做出来了。最后我在看B题,组合数学题,不知道怎么处理大数阶乘,用java搞出来解,但是因为复杂度的问题,wa了,最后金姐和彭彭莫名其妙搞出了G题。太强了啊。如果会做更多组合数学题就好了呜呜。 P:E题是一道水题,然而打的时候还是不必要的WA了一次(傻的判断条件写错了。。还自己没找到,金姐看到的)。G题首先的想法以为只会有两种不同的数字,然而思路是错的,被金姐推翻。后来。。就跟这道题杠上了,然后突发奇想,逆向思维向上推,受金姐启发,在思路不完全清晰的情况下,找到了能够应征大家之前所有例子的正确解,然后金姐就打了,就A了之后都还不是特别明白为什么。直到结束,问了隔壁队。   J:H题也是一道水题,但是刚开始样例没看懂,结果听隔壁队口胡,突然就看懂了,但是后来想复杂了,想到万一水不够木块浮起来怎么办,把隔壁队也给带歪了,最后看到A了那么多人,应该没那么复杂,就A了 题解: A - A Count Task HDU - 6480 简单字符串题

从零开始学动态规划(转)

流过昼夜 提交于 2020-04-30 12:55:46
动态规划的定义: 动态规划是运筹学的一个分支,是求解决策过程的最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。在各种算法中,我认为动态规划是较难掌握好的,主要难在模型的建立。 解题的一般步骤是: 1.找出最优解的性质,刻画其结构特征和最优子结构特征; 2.递归地定义最优值,刻画原问题解与子问题解间的关系; 3.以自底向上的方式计算出各个子问题、原问题的最优值,并避免子问题的重复计算; 4.根据计算最优值时得到的信息,构造最优解。 话不多说,我们来看几个具体的例子慢慢理解它: 1.矩阵连乘 给定n个可连乘的矩阵{A1, A2, …,An},根据矩阵乘法结合律,可有多种不同计算次序,每种次序有不同的计算代价,也就是数乘次数。例如给定2个矩阵A[pi,pj]和B[pj,pk],A×B为[pi,pk]矩阵,数乘次数为pi×pj×pk。将矩阵连乘积Ai…Aj简记为A[i:j] ,这里i≤j。考察计算A[i:j]的最优计算次序,设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i≤k<j,则A[i:j]的计算量=A[i:k]的计算量+A[k+1:j]的计算量+A[i:k]和A[k+1:j

2020年04月25日个人赛

三世轮回 提交于 2020-04-30 11:24:00
A - Romaji 题意:本题比较简单,给你一个字符串,要你判断字符串中的每一个辅音字符后面是否有一个元音字符。 题解:简单签到题,模拟即可。 代码: #include<iostream> #include <cstring> #include <algorithm> #define ll long long using namespace std; int main(){ string ptr; string ar= " aeiou " ; // 云 cin>> ptr; int f= 1 ; for ( int i= 0 ;i<ptr.length();i++ ){ if (ptr[i]!= ' n ' &&ar.find(ptr[i])==- 1 ){ // 辅音 if (ar.find(ptr[i+ 1 ])!=- 1 ){ } else { f = 0 ; break ; } } } if (f== 1 ){ cout << " YES " << endl; } else { cout << " NO " << endl; } return 0 ; } B - Turn the Rectangles 题意:本题比较简单,给你一长串长方形的长宽,要你判断在相对位置不发生改变,你可以将任意一个矩形进行旋转,角度为90度,方向任意的情况下,能否形成高度递减排列。 题解

区间求小于等于k的数字个数 hdu4177

我的未来我决定 提交于 2020-04-30 04:21:34
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目意思给出一个序列,叫我们求一个区间里面小于等于k的数字个数。 这里面我用分块和主席树两种方法都做了一遍,恩,主席树虽然费空间,但是还是比分块块很多的。 因为每个人的风格不一样,所以我的代码可能比较长,比较繁琐。 首先是分块,分块的思想就是把整个区间划分成多个块,用数组来记录每个块的信息,当我们对一个区间进行查询或者修改的时候,一般来说就会有一些块完全的在这个区间里面,对于这种块被区间完全包含的情况,我们就可以对这些块进行整体的操作,把每一块看成一个整体来进行查询或者修改,而对于那种不完整的块(这种块一般就在区间的两头,最多就只有两块是没有完全被包含在区间里面的,其实左右两边的块就算是完整的我们也把它看成不完整的块来处理),我们对它进行暴力修改或者查询。 在这道题目里面,我们把给出的初始序列分块,假设我用a数组来储存,那么我把a数组复制给b数组,对b数组的每一个块进行块内排序,这样当我们查询区间小于等于k的的数字个数时,对于完整的块我们就可以在b数组里面用二分在块内进行查找(b数组是有序的),对于不完整的块,我们将在原来的数组a里面用暴力查找。 代码: #include<iostream> #include <cstring> #include <algorithm>

HDU 6298.Maximum Multiple-数学思维题(脑子是个好东西,可惜我没有) (2018 Multi-University Training Contest 1 1001)

不想你离开。 提交于 2020-04-30 04:20:13
暑假杭电多校第一场,这一场是贪心场,很多贪心的题目,但是自己太菜,姿势挫死了,把自己都写吐了。。。 2018 Multi-University Training Contest 1 HDU6298. Maximum Multiple 题目意思就是给你一个n,找出来三个数x,y,z, 使得n=x+y+z,而且x,y,z都是n的因数,并且x*y*z为最大值,让你输出来x*y*z的最大值。如果没有满足条件的情况就输出-1。 由1=1/2+1/3+1/6=1/3+1/3+1/3=1/2+1/4+1/4,所以只需要判断n能否被3和4整除就可以,但是自己智障,判的是能否被2和3整除,简直是蠢到南天门的操作,当时想的就是能被4整除的肯定也能被2整除,我直接判2就可以,但是并没有想反过来是不是成立的,这是个充分不必要条件啊,能被2整除的不一定能被4整除啊,eg:10,mdzz。。。 其他的没什么,这是个水题,但是我们卡了。。。 代码: 1 // 1001-数学思维题 脑子是个好东西可惜我没有。 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<cctype> 8 #include<cstdlib> 9 #include

[CodeChef

好久不见. 提交于 2020-04-30 04:17:02
  大致题意:     给出两个序列A,B,A初始为负无穷,B初始为0,有三种操作     1、在A上区间[u,v]上加一个等差数列,取与原本A序列的最大值。     2、在B上区间[u,v]上加一个等差数列。     3、给出一个点X,询问A[X]+B[X]的值。     学习一个李超线段树就ojbk了,对于每次加入的等差数列,可以转化为y=a*i+b的一条线段,用李超线段树维护所有线段     所覆盖的区间即可。数据范围比较大,线段树可以动态开点,也可以离散化。      1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include< set > 7 #include<map> 8 #include<stack> 9 #include<time.h> 10 #include<cstdlib> 11 #include<cmath> 12 #include<list> 13 using namespace std; 14 #define MAXN 10000006 15 #define eps 1e-8 16 #define For(i,a,b) for(int i=a;i<=b;i++) 17 #define Fore(i