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 ...
随机推荐
- html5的canvas鼠标点击画圆
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...
- 听老外吐槽框架设计,Why I Hate Frameworks?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. Hello,小伙伴们,今天不聊技术,分享点有意思的东西.前段时间,表弟给我发过来一篇老外写的文章,以略带讽刺的对话方式调侃了自己对框架的看法,我 ...
- 【vector的输出问题】 洛谷 P1996 约瑟夫问题
题目:P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 可恶啊,本来是一道不算难的题,硬是因为cin,cout同步流卡了我一天qwq 关闭cin,cout同步流 ...
- JmxTest
package mbeanTest; import java.util.Set; import javax.management.Attribute; import javax.management. ...
- docker之镜像制作
#:下载镜像并初始化系统 root@ubuntu:~# docker pull centos #:创建目录 root@ubuntu:/opt# mkdir dockerfile/{web/{nginx ...
- 【Spring Framework】Spring入门教程(七)Spring 事件
内置事件 Spring中的事件是一个ApplicationEvent类的子类,由实现ApplicationEventPublisherAware接口的类发送,实现ApplicationListener ...
- jQuery对象进行方法扩展
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>01 ...
- Jenkins动态选择分支/tag
目录 一.简介 二.配置 三.配置tag 四.其它方法 五.List Git Branches插件 一.简介 一般选择分支构建,Git Parameter插件即可.这里是应用pipline的同时,可以 ...
- JS 双向数据绑定、单项数据绑定
简单的双向数据绑定 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [BUUCTF]PWN——jarvisoj_tell_me_something
jarvisoj_tell_me_something 附件 步骤: 例行检查,64位程序,开启了NX保护 运行一下程序,看看程序的大概流程 64位ida载入,shift+f12检索程序里的字符串 看到 ...