hdu 4407 Sum
http://acm.hdu.edu.cn/showproblem.php?pid=4407
题意:给定初始n个数1..n,两个操作,①1 x y p 询问第x个数到第y个数中与p互质的数的和; ②:2 x y 把第x个数变成y;
思路:
把p分解质因子,然后找出(1,pos)内与p不互质的,然后用的减去就是互质的和,第二个操作用到map映射,记录在那个位置改变之后的数。
1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 #include <vector> 5 #include <algorithm> 6 #define LL __int64 7 #define maxn 400001 8 using namespace std; 9 10 int t; 11 int n,m; 12 13 LL gcd(LL a,LL b) 14 { 15 return b==0?a:gcd(b,a%b); 16 } 17 18 19 LL deal(LL x,LL y) 20 { 21 LL res=x*(x+1)/2; 22 vector<int>p; 23 for(int i=2; i*i<=y; i++) 24 { 25 if(y%i==0) 26 { 27 p.push_back(i); 28 while(y%i==0) 29 { 30 y/=i; 31 } 32 } 33 } 34 if(y>1) p.push_back(y); 35 LL ans=0; 36 for(int i=1; i<(1<<((int)p.size())); i++) 37 { 38 LL xx=0; 39 LL c=1; 40 for(int j=0; j<(int)p.size(); j++) 41 { 42 if(i&(1<<j)) 43 { 44 xx++; 45 c*=p[j]; 46 } 47 } 48 LL t=x/c; 49 LL sum=((t+1)*t/2)*c; 50 if(xx%2) 51 { 52 ans+=sum; 53 } 54 else 55 ans-=sum; 56 } 57 return res-ans; 58 } 59 60 int main() 61 { 62 map<int,int>q; 63 scanf("%d",&t); 64 while(t--) 65 { 66 q.clear(); 67 scanf("%d%d",&n,&m); 68 int x,y,op,pp; 69 for(int i=1; i<=m; i++) 70 { 71 scanf("%d",&op); 72 if(op==1) 73 { 74 scanf("%d%d%d",&x,&y,&pp); 75 LL sum=deal((LL)y,(LL)pp)-deal((LL)(x-1),(LL)pp); 76 map<int,int>::iterator it=q.begin(); 77 while(it!=q.end()) 78 { 79 if(it->first>=x&&it->first<=y) 80 { 81 if(gcd(it->first,pp)==1) 82 { 83 sum-=it->first; 84 } 85 if(gcd(it->second,pp)==1) 86 { 87 sum+=it->second; 88 } 89 } 90 it++; 91 } 92 printf("%I64d\n",sum); 93 } 94 else 95 { 96 scanf("%d%d",&x,&y); 97 q[x]=y; 98 } 99 } 100 } 101 return 0; 102 }
View Code
转载于:https://www.cnblogs.com/fanminghui/p/4113650.html
hdu 4407 Sum相关推荐
- HDU 4407 sum 容斥原理
算法: 利用数据1...N的性质,求与P的互质的个数,位运算,容斥定理.. #include<stdio.h> #include<stdlib.h> #include<s ...
- HDU 4407 Sum(容斥原理+状态压缩)
题目链接 容斥原理不会,map不会,状态压缩不会.做毛线... 题目大意:给出1-n,n个数,有两个操作1是询问x-y区间上与p互质的数的和是多少,2是改变x位置上的数为c. 自己确实办不了,map这 ...
- HDU 4407 Sum(容斥+等差求和)
题目大意:给n个数,1-n.然后有m次操作,分别是求(x,y)中与p互质的和:将第x个数替换成c. 思路:一开始觉得区间操作往线段树上想,但是要存的东西太多,没有办法实现. 后面其实仔细一想跟前面几道 ...
- HDU.1001 Sum Problem
原题 HDU.1001 Sum Problem 分类 杂题 题意 计算从1到正整数n的累加和. 输入/输出 要求与格式 输入内容 每行输入一个正整数 输出结果 结果为累加和 输出格式 每个输出结果独占 ...
- hdu 1258 Sum It Up(回溯算法)
题意:从给定的n个正整数中选出m个数(m <= n)使得这m个数的和为给定的total 解法:回溯 /* Author: ACb0y Date: 2010-11-11 ProblemId: hd ...
- hdu 4676 Sum Of Gcd 莫队+phi反演
Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...
- HDU 1258 Sum It Up
这题郁闷了,排序过不了,后来仔细想想不用排序, 于是果断删了,没想到删了再杭电能过,在北大不能过,真郁闷了 这题是以简单DFS,在搜到时把结果存起来,然后再暴力搜索,看是否已存在这样的sum,最后一次 ...
- hdu 3022 Sum of Digits
http://acm.hdu.edu.cn/showproblem.php?pid=3022 题意: 最多不超过10000组数据,每组数据给定两个数n,m,求一个最小的数,使得该数每一位之和等于n,每 ...
- HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题
分析:就是判断简单的前缀有没有相同,注意下自身是m的倍数,以及vis[0]=true; #include <cstdio> #include <cstdlib> #includ ...
最新文章
- java 汉字转拼音_推荐一款前端汉字转拼音组件工具
- SQL实现分组查询取前几条记录
- org.springframework.beans.factory.BeanCreationException:
- Demon_接金币(三个掉落物品预设体,一接物体的工具)
- linux 入门教程
- Hadoop大数据--Mapreduce编程规范及入门示例
- android 加载多个图片 内在溢出的问题
- C语言libcurl例程:multi 多线程,多任务
- springboot和springcloud及常用注解积累
- Mysql 电商常用的时间操作(当天,昨天,7天,30天,半年,全年,季度等等)...
- php 浏览网页的原理,PHP网页运行原理
- 2.性能测试类型或方法
- Web 前端小白入门(一):心路历程,非技术指南
- 想知道PDF转Word软件哪个好?向你推荐3个自用软件
- 医学成像中的深度学习——基于PyTorch的3D 医学图像分割
- 2021充电必备:推荐一些免费的电子书网站及TXT阅读器
- springboot微信点餐系统项目设计
- 修改植物大战僵尸阳关代码
- cm-14.1 Android系统启动过程分析(4)-init进程的启动、rc脚本解析、zygote启动、属性服务
- 通识~FIR数字滤波器设计讲解
热门文章
- Node.js express 入门示例1
- Ubuntu Terminal Shortcut
- 重载赋值运算符含动态申请
- 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)...
- /boot/grub/grub.conf文件详解
- NetBeans 6.7.1、6.8界面美化
- 无法启动 MS DTC 事务管理器。LogInit 返回错误 0x2. 怎么办?
- Aerospike NoSQL 数据库介绍
- 【Android】Looper消息分发(msg.target.dispatchMessage), Handler消息处理(消息回调/外部回调/自身回调)
- 【C/C++高质量编程 笔记】