HDU 4947 GCD Array 容斥原理+树状数组

时间:2022-10-04 18:07:03

GCD Array

Time Limit: 11000/5500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 843    Accepted Submission(s):
205

Problem Description
Teacher Mai finds that many problems about arithmetic
function can be reduced to the following problem:

Maintain an array a
with index from 1 to l. There are two kinds of operations:

1. Add v to
ax for every x that gcd(x,n)=d.
  2. Query HDU 4947 GCD Array 容斥原理+树状数组

 
Input
There are multiple test cases, terminated by a line "0
0".

For each test case, the first line contains two integers
l,Q(1<=l,Q<=5*10^4), indicating the length of the array and the number of
the operations.

In following Q lines, each line indicates an operation,
and the format is "1 n d v" or "2 x"
(1<=n,d,v<=2*10^5,1<=x<=l).

 
Output
For each case, output "Case #k:" first, where k is the
case number counting from 1.

Then output the answer to each query.

 
Sample Input
6 4
1 4 1 2
2 5
1 3 3 3
2 3
0 0
 
Sample Output
 
Case #1:
6
7
 
Author
xudyh
 
Source
 
 题意:2个操作
         在长度长度为len的数组操作
         1 n v d 给数组x下标满足 gcd(x,n)=d的对应位置+v.
         2 x 询问数组sum(a1,,,ax)的和
思路:如果一个一个更新是会超时的。
        方法大致是这样,首先和GCD()问题类似,从反面着手,首先全部数字+v,然后在gcd(x,n)!=d的位置-v。
        gcd(x,n) = d 可以转化为gcd(x/d,n/d)=1; 转化为求互质。这个应该容易理解些。
        现在我设立一个数组a[ ] ,a[i] 代表的意思是 gcd(x,n)为i的倍数的时候的方案数。
    那么原来的问题,N = n/d ,现在就分解N的素因子,并进行容斥。比如6 : 2 , 3 , -6.
        首先在所有的数字上加v,然后用容斥的结果在数组上进行对不互质的地方进行-v。
        举一个例子。
    比如len = 10 , gcd(x,6) = 2; ==> gcd(x/2,3)=1;
       那么我们只能在[1-10/2]进行更新。
       求得的容斥结果为 2 , 3, -6.那么首先我们在所有的数字上+v,就是a[d]=v,(a[2]=v);
       然后在2*d上减去v,3*d上减去v,6*d上加上v。就是这样。
       至于为什么要*d,这个思考一下就会知道的。
       这就是第一个操作了。
       第二个操作就是询问数组【1-x】的和,转化为求数组在a[i]有多少个 x/i 个。
       就是sum(a[i]*x/i) ;由于 x/i 我们能用sqrt()的算法来做。这里也就牵涉到求和,用树状数组。
       代码比较挫,几乎是压线过。
      
 #include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef __int64 LL; const int maxn = +;
const int INF = 2e5+;
LL p[maxn];
bool s[INF];
int prime[],len; void Init()
{
len = ;
memset(s,false,sizeof(s));
for(int i=;i<INF;i++)
{
if(s[i]==true)continue;
prime[++len] = i;
for(int j=i+i;j<INF;j=j+i)
s[j]=true;
}
}
void add(int x,int n,int num1)
{
for(int i=x;i<=n;i=i+(i&(-i)))
p[i] = p[i] + num1;
}
LL query(int x)
{
if(x==)return ;
LL sum1 = ;
while(x)
{
sum1=sum1+p[x];
x=x-(x&(-x));
}
return sum1;
}
int Q[],yz[],ylen,qlen;
void init(int n)
{
ylen = qlen = ;
for(int i=;prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==)
{
while(n%prime[i]==) n=n/prime[i];
yz[++ylen] = prime[i];
}
}
if(n!=) yz[++ylen] = n;
Q[]=-;
for(int i=;i<=ylen;i++)
{
int k = qlen;
for(int j=;j<=k;j++)
Q[++qlen] = -*Q[j]*yz[i];
}
}
int main()
{
int n,m,hxl,d,v,size1,x,T=;
Init();
while(scanf("%d%d",&n,&m)>)
{
if(n==&&m==)break;
memset(p,,sizeof(p));
printf("Case #%d:\n",++T);
while(m--)
{
scanf("%d",&size1);
if(size1==)
{
scanf("%d%d%d",&hxl,&d,&v);
if(hxl%d!=)continue;
hxl = hxl /d;
int tom = n/d;
add(d,n,v);
init(hxl);
for(int i=;i<=qlen;i++)
if(Q[i]<) {
Q[i] = -Q[i];
if(Q[i]>tom)continue;
add(Q[i]*d,n,v);
}
else {
if(Q[i]>tom)continue;
add(Q[i]*d,n,-v);
}
}
else{
scanf("%d",&x);
LL sum1 = ;
for(int i=,la=;i<=x;i=la+){
la = x/(x/i);
sum1 = sum1 + (query(la)-query(i-))*(x/i);
}
printf("%I64d\n",sum1);
}
}
}
return ;
}

HDU 4947 GCD Array 容斥原理+树状数组的更多相关文章

  1. HDU 4777 Rabbit Kingdom --容斥原理&plus;树状数组

    题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...

  2. HDU 5862 Counting Intersections&lpar;离散化&plus;树状数组&rpar;

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  3. hdu 5517 Triple&lpar;二维树状数组&rpar;

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  4. HDU 5869 Different GCD Subarray Query &lpar;GCD种类预处理&plus;树状数组维护&rpar;

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  5. HDU 5869 Different GCD Subarray Query 树状数组&plus;离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

  6. HDU 5869 Different GCD Subarray Query 树状数组 &plus; 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  7. HDU 5792 L - World is Exploding 。容斥原理 &plus; 树状数组 &plus; 离散化

    题目,要求找出有多少对这样的东西,四个数,并且满足num[a]<num[b] &&num[c]>num[d] 要做这题,首先要懂得用树状数组,我设,下面的小于和大于都是严格 ...

  8. HDU 1394 Minimum Inversion Number &lpar; 树状数组求逆序数 &rpar;

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  9. HDU 5862 Counting Intersections (树状数组)

    Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...

随机推荐

  1. Maven-3&period;2&period;2安装配置

    (1)安装JDK,这里是1.7.0_51 (2)Maven-3.2.2下载地址:http://mirrors.cnnic.cn/apache/maven/maven-3/3.2.2/binaries/ ...

  2. C&plus;&plus;Builder 笔记

    1.界面窗口如何不显示标题栏? 在Form属性栏里面把BorderStyle的值设为None 2.wchar_t wchar_t是C/C++的字符类型,是一种扩展的存储方式,wchar_t类型主要用在 ...

  3. C&num; 条码标签打印程序,RDLC报表动态显示多条码标签的方法

    初学c#,因最近公司客户要求原出货标签需实现条码化,练手的机会来了,遂动手做这个程序,开始都是一些增删改查操作一直很顺利,但到RDLC报表将条码显示到报表上犯难了,因为初学未接触过报表,上网查资料均一 ...

  4. yii2源码学习笔记(十八)

    View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...

  5. poj1691绘画板

    1 7 0 0 2 2 1 0 2 1 6 2 2 0 4 2 1 1 2 4 4 2 1 4 3 6 1 4 0 6 4 1 3 4 6 6 2 #include<stdio.h> #i ...

  6. Linux 从 sar 到 sar2html 的认识

    这些变形的工具.诸如:淘宝的Tsar.ksar.sar2html....等.都是通过抓取 sar的数据   所以在最终呈现的数据上变化不大.只是展现的手段和效果不一样而已      sar 是帮助我们 ...

  7. hdu&lowbar;3001&lowbar;Travelling&lpar;状压DP&rpar;

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:给你N个点,M条边,每个点最多走两次,问走完N个点最短的路程为多少. 题解:注意这题有重边 ...

  8. 发布一个参考ssdb,用go实现的类似redis的高性能nosql:ledisdb

    起因 ledisdb是一个参考ssdb,采用go实现,底层基于leveldb,类似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持. 我们现在的应用极大的依 ...

  9. loadrunner代理录制脚本

    1.打开loadrunner录制脚本选项: 2.start  recording弹窗选择options: 3.设置loadrunner端口,可自定义:后面的浏览器设置代理需要用到此处设置的端口号: 4 ...

  10. JavaScript开发工具简明历史

    译者按: JavaScript开发要用到的工具越来越多,越来越复杂,为什么呢?你真的弄明白了吗? 原文: Modern JavaScript Explained For Dinosaurs 为了保证可 ...