sum

[洛谷P4213]【模板】杜教筛(Sum)

江枫思渺然 提交于 2020-03-01 07:41:46
题目大意: 给你$n$,求: $$ \sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i) $$ 最多$10$组数据,$n\leqslant2^{31}-1$ 题解: 杜教筛,用来求$\sum\limits_{i=1}^nf(i)$的,其中$f$是某个特殊函数。 若我们可以找到一个函数$g$,使得$g,f*g$两个函数的前缀和十分好算($g*f$表示$g$和$f$的狄利克雷卷积),就可在$O(n^{\frac 23})$的复杂度内求出我们要的东西。令$S(n)=\sum\limits_{i=1}^nf(i)$ $$ \begin{align*} \sum\limits_{i=1}^n(g*f)(i)&=\sum\limits_{i=1}^n\sum\limits_{d|i}g(d)f\left(\dfrac id\right)\\ &=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1,d|i}^nf\left(\dfrac id\right)\\ &=\sum\limits_{d=1}g(d)S\left(\left\lfloor\dfrac nd\right\rfloor\right) \end{align*}\\ g(1)S(n)=\sum\limits_{i=1}^n(f*g)(i)-

437. 路径总和 III

℡╲_俬逩灬. 提交于 2020-03-01 07:33:33
给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 返回 3。和等于 8 的路径有: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11 坑:1 if s==0 else 0 三目运算式不要放在return里 ,不然出问题,原因不明 1.双重递归 2.前缀和+递归 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def pathSum(self, root, sum): if not root: return 0 def f(t,s): if not t: return 0 s-=t

浅谈几种筛法

送分小仙女□ 提交于 2020-03-01 06:35:43
杜教筛 问题一般是求 \[\sum_{i=1}^{n}f(i)\] 这样的式子。 然后我们有一种很妙的想法,那就是构造两个积性函数 \(h,g\) ,使得 \(h=f*g\) 然后尝试推一下 \(h\) 的前缀和,发现: \[ \sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)\cdot f(\frac{i}{d})\\=\sum_{d=1}^{n}g(d)\cdot\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f({i}) \] 如果记 \(S(n)=\sum_{i=1}^nf(i)\) ,那么就可以写成: \[\sum_{i=1}^{n}h(i)=\sum_{d=1}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor)\] 把 \(d=1\) 提出来,得到我们想要的式子: \[g(1)S(n)=\sum_{i=1}^{n}h(i)-\sum_{d=2}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor)\] 那么如果 \(h\) 的前缀和我们可以在一个比较优秀的时间复杂度内求出,则后面那一部分的时间复杂度在进行 整除分块 后,可以达到一个优秀的时间复杂度 \(O(n^{\frac{2}{3}})\) 。 一些题目 51nod1244 题意:

灵活运用生成器,怎么着也得做几道题

南楼画角 提交于 2020-02-29 15:41:17
生成器的含义基本上在我的前两篇博客已经写得差不多了。 所以在我们就应该做几道题目,加深下对生成器的用法。 题目一:变换平均值求法 在一个数列 num = [1,2,3,4,5] 中它的平均值是 3 ,那么当我们往数列中再次加入一个值 9 ,那么平均数便是 4 正常的思路是这样 num = [1,2,3,4] count = 0 sum = 0 for i in range(len(num)): sum += num[i] avg = sum / len(num) print(sum) print(avg) 但是如果将这段代码应用到统计博客的平均流量上的话,就会有些欠妥,因为博客的流量每天都要进行更新,那么如果是这样的话,我们每次执行数据,都要在上面添加新的一天的流量再去执行代码,也就是存在列表中的数据却来却多,所以我们便会想到优化下内存,这时候就可以使用生成器。这样占用的内存小。 def average(): count = 0 arg = 0 sum = 0 while True: num = yield arg sum = sum + num count += 1 arg = sum / count a = [12,32,45,34] b = average() next(b) for i in a: ret = b.send(i) print(ret) 题目二

第2章-1 计算 11+12+13+...+m (30分)

大憨熊 提交于 2020-02-29 15:32:36
PTA 浙大版《Python 程序设计》题目集 第2章-1 计算 11+12+13+…+m (30分) 输入一个正整数m(20<=m<=100),计算 11+12+13+…+m 的值。 输入格式: 在一行输入一个正整数m。 输出格式: 在一行中按照格式“sum = S”输出对应的和S. 输入样例: 在这里给出一组输入。例如: 90 输出样例: 在这里给出相应的输出。例如: sum = 4040 方法1 print ( 'sum =' , sum ( [ i for i in range ( 11 , int ( input ( ) ) + 1 ) ] ) ) 方法2 m = int ( input ( ) ) sum = 0 for i in range ( 11 , m + 1 ) : sum += i print ( 'sum =' , sum ) 方法3 注: python3中的reduce函数需要先导包才可以使用 from functools import reduce print ( 'sum =' , reduce ( lambda x , y : x + y , [ i for i in range ( 11 , int ( input ( ) ) + 1 ) ] ) ) 来源: CSDN 作者: Joker-Tong 链接: https://blog.csdn

返回一个整数数组中最大子数组的和

梦想的初衷 提交于 2020-02-28 20:25:28
要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n) 设计思想   首先需要让其有数可存,设计数组,其次让其满足要求,通过限制条件,使得各个子数组求和,最后找出子数组和的最大值 出现的问题 在编辑过程中不能很好的解决满足情况的子数组 源代码 import java.util.ArrayList; import java.util.List; import java.util.Random; public class number { public static void main(String[] args){ List<Integer> list = new ArrayList<>(); int sum = Integer.MIN_VALUE; int i,max = sum; Random random = new Random(); int length = random.nextInt(5); for (i = 0;i < length; i++){ list.add(random.nextBoolean()?random.nextInt(10):random.nextInt(10) * (-1)); } for (i = 0;i < length; i++){

记录一下使用 spring data jpa 的query注解中 count(sum)附带条件查询

*爱你&永不变心* 提交于 2020-02-28 19:37:20
有一条 sql 语句 如下 select district_coordinate,city_coordinate,province_coordinate,sum(pl.plot_type ='FUNC'),sum(pl.plot_type ='FARM') from t_plot pl left join t_position pt on pl.position_id = pt.id group by province_coordinate; 需要在group by 之后统计PlotType 为 FUNC 和 FARM 的个数 由于效率问题想在后端只执行一次sql 便能够查询出结果, 因此建立一个 DTO,结构如下 /** * @author liujunhong */ @Data @AllArgsConstructor public class PlotCountSummary { private String provinceCoordinate; private String cityCoordinate; private String districtCoordinate; /** * 农场个数 */ private Object farmCount; /** * 功能区个数 */ private Object funcCount; } 查询语句如下 @Query(

SQL语句使用sum求和,但如果没有结果返回的是Null,但想要返回double怎么办

只谈情不闲聊 提交于 2020-02-28 18:42:55
SELECT COALESCE(SUM(money),0.00) FROM user_zhangmu WHERE phone= '15610077197' AND title = '-1' 使用COALESCE(a,b),当a的值等于NULL时,便会直接替换成b。 来源: CSDN 作者: 全栈小白搞安全 链接: https://blog.csdn.net/Wangdiankun/article/details/104558683

最大子序和

时光总嘲笑我的痴心妄想 提交于 2020-02-28 14:04:58
题目: 给定一个整数数组 nums ,找到一个具有最大和的 连续子数组 (子数组最少包含一个元素),返回其最大和。 1.思路: 暴力法,其中一个for循环遍历数组中的所有元素,再用一个for循环确定该元素开头的连续子数组最大和。 找某个元素开头之后的最大连续子数组和时,需在开始前更新sum=0,否则会得到错误答案。 该方法思路简单,但过程比较繁杂。 2.代码: public: int maxSubArray(vector<int>& nums) { int max=nums[0]; for(int i=0;i<nums.size();i++) {int sum=0; {for(int j=i;j<nums.size();j++) {sum=sum+nums[j]; if(sum>max) max=sum; } } } return max; } 3.分析: 通过上面的方法进行解答,内存消耗和执行用时都比较高。 需要在不断的学习中简化过程,希望在以后的学习中能在掌握一种语言。 来源: CSDN 作者: KZH34 链接: https://blog.csdn.net/KZH34/article/details/104550669

C#基础--面向过程计算器

独自空忆成欢 提交于 2020-02-28 03:16:39
//面向过程计算器 //思路: 需要注意的是: 两个数相除 除数不能为0; //1、提示用户输入 //2、进行运算 //3、得到结果 Console.WriteLine("请输入第一个数字: "); double firstNumber = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入第二个数字: "); double secondNumber = Convert.ToDouble(Console.ReadLine()); //提示输入运算符 string oper = Console.ReadLine(); //声明一个用于存储结果的变量 //double sum = 0; //可空类型 double? sum = null; //异常的处理: 除数不能为零 try { //用switch case进行多条件的定值的判断 switch (oper) { case "+": sum = firstNumber + secondNumber; break; case "-": sum = firstNumber - secondNumber; break; case "*": sum = firstNumber * secondNumber; break; case "/": sum =