http://acm.hdu.edu.cn/showproblem.php?pid=4407

Sum

Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1551    Accepted Submission(s): 232
Problem Description
XXX is puzzled with the question below:

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.

 
Input
There are several test cases.
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".
 
Output
For each operation 1, output a single integer in one line representing the result.
 
SampleInput
1
3 3
2 2 3
1 1 3 4
1 2 3 6
 
SampleOutput
7
0

给定一个数x可以表示成p = p1i1p2i2...pnin;要求x,x+1,x+2,...y与x互质的数的和,等价于求x,x+1,x+2,...y与p=p1p2...pn互质。(p1,p2,...,pn为素数)

x,x+1,x+2,...y与p互质直接求不好求,所以可以反过来求,先求出与x不互质的数的和sum,然后ans=总的和-sum。

sum[[x,x+1,x+2,...y]与p不互质]=sum[[1,2,...y]与p不互质] - sum[[1,2,x-1]与p不互质],

考虑p的素因子pi,则[1..y]中与pi不互质的数的个数是[y/pi].

然而,如果我们单纯将所有结果相加,有些数就会被统计多次(被好几个素因子整除)。所以,我们要运用容斥原理来解决。

aaarticlea/png;base64,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" alt="" />

http://zh.wikipedia.org/wiki/容斥原理

比如要求[1,2,...,10]和10不互质的和,10=2*5,与2不互质的有2,4,6,8,10,与5不互质的有5,10;但还要减去与2*5不互质10;每个与pi不互质的是一个等差数列,

所以等差数列求和即可。

(因为m最多1000,所以修改的数不多,所以后面对修改的数单独处理就ok了。)

第一步要求x的所有因子。

第二步运用容斥原理,奇数项加,偶数项减。

再枚举修改的值就差不多了。

n<=400000,所以ans可能会超int

 int size;//因子个数
int yinzi[];
void get_yinzi(int n)
{
size = ;
if (!(n & ))//为偶数
{
yinzi[size++] = ;
while (n /= , !(n & ));
}
int i, sqrtn = (sqrt(1.0 * n) + 0.5);
for (i = ; i <= sqrtn; i += )
{
if (n % i == )
{
yinzi[size++] = i;
while (n /= i, n % i == );
}
if (n == )
return;
}
if (n > )
yinzi[size++] = n;
}
//详见大牛博客http://www.cnblogs.com/xin-hua/p/3213050.html
1 #define llt long long int
llt solve(int r)//容斥原理,二进制法,总共有2size-1项
{
llt sum = ;
int bits;//1的个数,奇数加,偶数减
int pi;//
int i, j = << size, t;
int k;//选中的第几个因子
for (i = ; i < j; i++)//看i的二进制表示,假设size=4,i=1011,表示yinzi[3]∩yinzi[1]∩yinzi[0]即pi = yinzi[3]*yinzi[1]*yinzi[0]
{
pi = ;
t = i;
k = bits = ;
while (t)
{
if (t & )
{
pi *= yinzi[k];
bits++;
}
k++;
t >>= ;
}
t = r / pi;
if (bits & )//等差数列求和
sum += 1ll * (pi + pi * t) * t / ;
else
sum -= 1ll * (pi + pi * t) * t / ;
}
return sum;
}
 int gcd(int a, int b)
{
return b ? gcd (b, a % b) : a;
} llt sum(int n)
{
return 1ll * ( + n) * n / ;
}
map<int, int> mp;//使用map对修改的数进行操作
map<int,int>::iterator it;
int main()
{
int tests, n, m, i, op, x, y, p, c;
llt ans;
scanf("%d", &tests);
while (tests--)
{
mp.clear();
scanf("%d%d", &n, &m);
while (m--)
{
scanf("%d", &op);
if (op == )
{
ans = ;
scanf("%d%d%d", &x, &y, &p);
if (x > y)
swap(x, y);
get_yinzi(p);
for (it = mp.begin(); it != mp.end(); it++)
{
if (it->first != it->second && it->first >= x && it->first <= y)
{
ans -= gcd(it->first, p) == ? it->first : ;
ans += gcd(it->second, p) == ? it->second : ;
}
}
printf("%I64d\n", ans + sum(y) - sum(x - ) - solve(y) + solve(x - ));
}
else
{
scanf("%d%d", &x, &c);
mp[x] = c;
}
}
}
return ;
}

hdu4407Sum(容斥原理)的更多相关文章

  1. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  2. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  3. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  4. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

  5. ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)

    二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  6. HDU5838 Mountain(状压DP + 容斥原理)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5838 Description Zhu found a map which is a N∗M ...

  7. 【BZOJ-2669】局部极小值 状压DP + 容斥原理

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 561  Solved: 293[Submit][Status ...

  8. HDU 2204Eddy's爱好(容斥原理)

    Eddy's爱好 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  9. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

随机推荐

  1. MVC和MTV结构分析

    @font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@ ...

  2. Zookeeper(1、3、5节点)集群安装

    1节点 1 week110的zookeeper的安装 + zookeeper提供少量数据的存储 3节点 hadoop-2.6.0.tar.gz的集群搭建(3节点) hadoop-2.6.0-cdh5. ...

  3. AtCoder Grand Contest 001 D - Arrays and Palindrome

    题目传送门:https://agc001.contest.atcoder.jp/tasks/agc001_d 题目大意: 现要求你构造两个序列\(a,b\),满足: \(a\)序列中数字总和为\(N\ ...

  4. Java对象的内存布局以及对象的访问定位

    一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...

  5. h5-27-存储/读取JS对象

    存储JS对象 <script type="text/javascript"> /*封装人员信息*/ function Person(id,name,age) { thi ...

  6. Objective-C和 C++ 混编的要点(转)

    Using C++ With Objective-C苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++.有 ...

  7. 序列化shelve模块

    1.shelve对pickle进行封装,所以shelve也只能在python里使用. shelve可以进行多次dump而且顺序不会乱. import shelve f = shelve.open('s ...

  8. CF750C New Year and Rating

    题意: 在cf系统中,给定一个人每次比赛所属的div及比赛之后的分数变化.计算经过这些比赛之后此人的rating最高可能是多少. 思路: 模拟. 实现: #include <cstdio> ...

  9. Spring中@Value的使用

  10. Linux服务器用iotop命令分析服务器磁盘IO情况

    Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦.如果会systemtap, 或者blktrace这些事情 ...