Sum(hdu4407)
Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2974 Accepted Submission(s): 843
1, 2, 3, ..., n (1<=n<=400000) are placed in a line. There are m (1<=m<=1000) operations of two kinds.
Operation
1: among the x-th number to the y-th number (inclusive), get the sum of
the numbers which are co-prime with p( 1 <=p <= 400000).
Operation 2: change the x-th number to c( 1 <=c <= 400000).
For each operation, XXX will spend a lot of time to treat it. So he wants to ask you to help him.
The first line in the input is an integer indicating the number of test cases.
For each case, the first line begins with two integers --- the above mentioned n and m.
Each the following m lines contains an operation.
Operation 1 is in this format: "1 x y p".
Operation 2 is in this format: "2 x c".
3 3
2 2 3
1 1 3 4
1 2 3 6
0
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<queue>
7 #include<map>
8 typedef long long LL;
9 using namespace std;
10 bool prime[400005];
11 int ans[400005];
12 queue<int>que;
13 int cm[400005];
14 int ma[400005];
15 int flag[2000];
16 int gcd(int n,int m);
17 map<int,int>my;
18 int main(void)
19 {
20 int i,j,k;
21 int p,q;
22 int n,m;
23 int x,y;
24 int t;
25 for(i=2; i<=2000; i++)
26 {
27 if(!prime[i])
28 {
29 for(j=i; i*j<=400000; j++)
30 {
31 prime[i*j]=true;
32 }
33 }
34 }
35 int cnt=0;
36 for(i=2; i<=400000; i++)
37 {
38 if(!prime[i])
39 {
40 ans[cnt++]=i;
41 }
42 }
43 scanf("%d",&k);
44 while(k--)
45 { my.clear();
46 scanf("%d %d",&p,&q);
47 int bt=1;
48 for(i=0; i<=p; i++)
49 ma[i]=i;
50 while(q--)
51 {
52 scanf("%d",&n);
53 if(n==1)
54 {
55 scanf("%d %d %d",&x,&y,&t);
56 int r=0;
57 int yy=0;
58 int xy=t;
59 if(x>y)swap(x,y);
60 while(t>1)
61 {
62 if(r==0&&t%ans[yy]==0)
63 {
64 r=1;
65 que.push(ans[yy]);
66 t/=ans[yy];
67 }
68 else if(r==1&&t%ans[yy]==0)
69 {
70 t/=ans[yy];
71 }
72 else
73 {
74 r=0;
75 yy++;
76 }
77 }
78 x-=1;
79 int ak=0;
80 while(!que.empty())
81 {
82 cm[ak++]=que.front();
83 que.pop();
84 }
85 LL sum1=0;
86 LL sum2=0;
87 for(i=1; i<=(1<<ak)-1; i++)
88 {
89 int nn=0;
90 LL dp=1;
91 for(j=0; j<ak; j++)
92 {
93 if(i&(1<<j))
94 {
95 nn++;
96 dp*=(LL)cm[j];
97 }
98 }
99 if(nn%2)
100 {
101 LL ct=y/dp;
102 LL qt=x/dp;
103 LL ct1=ct+1;
104 LL qt1=qt+1;
105 sum1+=dp*ct1*ct/2;
106 sum2+=dp*qt1*qt/2;
107 }
108 else
109 {
110 LL ct=y/dp;
111 LL qt=x/dp;
112 LL ct1=ct+1;
113 LL qt1=qt+1;
114 sum1-=dp*ct1*ct/2;
115 sum2-=dp*qt1*qt/2;
116 }
117 } LL xc=1+x;LL yc=1+y;
118 LL ap1=(long long )(xc)*(long long)x/2;
119 LL ap2=(long long)(yc)*(long long)y/2;
120 ap2-=sum1;
121 ap1-=sum2;
122 ap2-=ap1;
123 for(j=1; j<bt; j++)
124 {
125 if(flag[j]>=x+1&&flag[j]<=y)
126 {
127 int cp=gcd(xy,ma[flag[j]]);
128 int cq=gcd(xy,flag[j]);
129 if(cq==1)
130 ap2-=flag[j];
131 if(cp==1)
132 ap2+=ma[flag[j]];
133 }
134 }
135 printf("%lld\n",ap2);
136 }
137 else
138 {
139 scanf("%d %d",&x,&t);
140 if(my[x]==0)
141 {my[x]=1;flag[bt]=x;bt++;}
142 ma[x]=t;
143 }
144 }
145 }
146 return 0;
147 }
148 int gcd(int n,int m)
149 {
150 if(m==0)
151 return n;
152 else if(n%m==0)
153 return m;
154 else return gcd(m,n%m);
155 }
Sum(hdu4407)的更多相关文章
- hdu4407 Sum 容斥原理
XXX is puzzled with the question below: 1, 2, 3, ..., n (1<=n<=400000) are placed in a line. T ...
- LeetCode - Two Sum
Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 112 - Path Sum
题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
- BZOJ 3944 Sum
题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [LeetCode] Partition Equal Subset Sum 相同子集和分割
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
- [LeetCode] Split Array Largest Sum 分割数组的最大值
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
随机推荐
- CAS简介
概念 CAS(Compare And Swap 比较并交换),是 乐观锁 的一种典型实现机制. 乐观锁主要的两个步骤:冲突检测.数据更新. 当多个线程尝试使用CAS同时更新通过一个变量的时候,只有一个 ...
- C语言中的字符和整数之间的转换
首先对照ascal表,查找字符和整数之间的规律: ascall 控制字符 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 ...
- 利用抖音Cookie充值接口提取支付链接,个人调起原生微信h5支付宝h5支付
最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...
- Idea中JSP页面中out内置对象报错out.println标红问题
问题如图: 解决方法: 导入jar包 1.在pom.xml的<dependencies>里面复制 <dependency> <groupId>javax.servl ...
- Linux 内存泄漏 valgrind
Valgrind 是个开源的工具,功能很多.例如检查内存泄漏工具---memcheck. Valgrind 安装: 去官网下载: http://valgrind.org/downloads/curre ...
- 乱序拼图验证的识别并还原-puzzle-captcha
一.前言 乱序拼图验证是一种较少见的验证码防御,市面上更多的是拖动滑块,被完美攻克的有不少,都在行为轨迹上下足了功夫,本文不讨论轨迹模拟范畴,就只针对拼图还原进行研究. 找一个市面比较普及的顶像乱序拼 ...
- pyqt5 改写函数
重新改写了keyPressEvent() class TextEdit(QTextEdit): def __init__(self): QtWidgets.QTextEdit.__init__(sel ...
- 常见排序——Java实现
1 package struct; 2 3 /** 4 * 5 * @作者:dyy 6 * @公司:陕西科技大学 7 * @修改日期: 8 * @邮箱:1101632375@qq.com 9 * @描 ...
- Android Menu的基本用法
使用xml定义Menu 菜单资源文件必须放在res/menu目录中.菜单资源文件必须使用<menu>标签作为根节点.除了<menu>标签外,还有另外两个标签用于设置菜单项和分组 ...
- Gradle入门及SpringBoot项目构建
https://blog.csdn.net/qq_27520051/article/details/90384483 一.介绍 Gradle 是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是 ...