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相关推荐

  1. HDU 4407 sum 容斥原理

    算法: 利用数据1...N的性质,求与P的互质的个数,位运算,容斥定理.. #include<stdio.h> #include<stdlib.h> #include<s ...

  2. HDU 4407 Sum(容斥原理+状态压缩)

    题目链接 容斥原理不会,map不会,状态压缩不会.做毛线... 题目大意:给出1-n,n个数,有两个操作1是询问x-y区间上与p互质的数的和是多少,2是改变x位置上的数为c. 自己确实办不了,map这 ...

  3. HDU 4407 Sum(容斥+等差求和)

    题目大意:给n个数,1-n.然后有m次操作,分别是求(x,y)中与p互质的和:将第x个数替换成c. 思路:一开始觉得区间操作往线段树上想,但是要存的东西太多,没有办法实现. 后面其实仔细一想跟前面几道 ...

  4. HDU.1001 Sum Problem

    原题 HDU.1001 Sum Problem 分类 杂题 题意 计算从1到正整数n的累加和. 输入/输出 要求与格式 输入内容 每行输入一个正整数 输出结果 结果为累加和 输出格式 每个输出结果独占 ...

  5. hdu 1258 Sum It Up(回溯算法)

    题意:从给定的n个正整数中选出m个数(m <= n)使得这m个数的和为给定的total 解法:回溯 /* Author: ACb0y Date: 2010-11-11 ProblemId: hd ...

  6. hdu 4676 Sum Of Gcd 莫队+phi反演

    Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...

  7. HDU 1258 Sum It Up

    这题郁闷了,排序过不了,后来仔细想想不用排序, 于是果断删了,没想到删了再杭电能过,在北大不能过,真郁闷了 这题是以简单DFS,在搜到时把结果存起来,然后再暴力搜索,看是否已存在这样的sum,最后一次 ...

  8. hdu 3022 Sum of Digits

    http://acm.hdu.edu.cn/showproblem.php?pid=3022 题意: 最多不超过10000组数据,每组数据给定两个数n,m,求一个最小的数,使得该数每一位之和等于n,每 ...

  9. HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题

    分析:就是判断简单的前缀有没有相同,注意下自身是m的倍数,以及vis[0]=true; #include <cstdio> #include <cstdlib> #includ ...

最新文章

  1. java 汉字转拼音_推荐一款前端汉字转拼音组件工具
  2. SQL实现分组查询取前几条记录
  3. org.springframework.beans.factory.BeanCreationException:
  4. Demon_接金币(三个掉落物品预设体,一接物体的工具)
  5. linux 入门教程
  6. Hadoop大数据--Mapreduce编程规范及入门示例
  7. android 加载多个图片 内在溢出的问题
  8. C语言libcurl例程:multi 多线程,多任务
  9. springboot和springcloud及常用注解积累
  10. Mysql 电商常用的时间操作(当天,昨天,7天,30天,半年,全年,季度等等)...
  11. php 浏览网页的原理,PHP网页运行原理
  12. 2.性能测试类型或方法
  13. Web 前端小白入门(一):心路历程,非技术指南
  14. 想知道PDF转Word软件哪个好?向你推荐3个自用软件
  15. 医学成像中的深度学习——基于PyTorch的3D 医学图像分割
  16. 2021充电必备:推荐一些免费的电子书网站及TXT阅读器
  17. springboot微信点餐系统项目设计
  18. 修改植物大战僵尸阳关代码
  19. cm-14.1 Android系统启动过程分析(4)-init进程的启动、rc脚本解析、zygote启动、属性服务
  20. 通识~FIR数字滤波器设计讲解

热门文章

  1. Node.js express 入门示例1
  2. Ubuntu Terminal Shortcut
  3. 重载赋值运算符含动态申请
  4. 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)...
  5. /boot/grub/grub.conf文件详解
  6. NetBeans 6.7.1、6.8界面美化
  7. 无法启动 MS DTC 事务管理器。LogInit 返回错误 0x2. 怎么办?
  8. Aerospike NoSQL 数据库介绍
  9. 【Android】Looper消息分发(msg.target.dispatchMessage), Handler消息处理(消息回调/外部回调/自身回调)
  10. 【C/C++高质量编程 笔记】