HDU 4947 GCD Array 容斥原理+树状数组
GCD Array
Time Limit: 11000/5500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 843 Accepted Submission(s):
205
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
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).
case number counting from 1.
Then output the answer to each query.
#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 容斥原理+树状数组的更多相关文章
- HDU 4777 Rabbit Kingdom --容斥原理+树状数组
题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- HDU 5869 Different GCD Subarray Query 树状数组+离线
Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...
- HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景
http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...
- HDU 5792 L - World is Exploding 。容斥原理 + 树状数组 + 离散化
题目,要求找出有多少对这样的东西,四个数,并且满足num[a]<num[b] &&num[c]>num[d] 要做这题,首先要懂得用树状数组,我设,下面的小于和大于都是严格 ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- HDU 5862 Counting Intersections (树状数组)
Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...
随机推荐
- jquery ui dialog去掉右上角的叉号
var dialog = $("#id").dialog({ resizable:false, height:, width:, zIndex:, modal:true, open ...
- EmguCV 阈值化
一.public static double cvThreshold( IntPtr src, IntPtr dst, double threshold, double maxValue, //Max ...
- 【iCore3双核心板】【4.3寸液晶驱动板爆照!】
[源代码完全开源,过几天连同硬件一起发布] 花了好久的时间,我们的fpga工程师才完成这液晶模块的驱动代码,其核心价值如下: 1.完全基于fpga驱动,sdram当做缓存: 2.内建双缓冲机制:方便 ...
- ubuntu下wine安装软件
安装wine 1. sudo apt-get install playonlinux playonlinux就是wine.或者在软件中心,搜索wine. 2. 在dash搜索playonlinux 安 ...
- Nginx配置proxy_pass转发的/路径问题
Nginx配置proxy_pass转发的/路径问题 在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则 ...
- java 求 两个数的百分比% (转)
int num1 = 7; int num2 = 9; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance(); / ...
- Java工具
1. Groovy shell 可以在Java代码里执行脚本,可以将Java方法配置在文件里 依赖 <dependency> <groupId>org.codehaus.gro ...
- Wordpress基础:文章和页面的区别
页面: 页面是你可以单独建立一个固定页面,可以作为留言板,或者通知的单页面,发布之后是固定的网址. 页面并不能被分类.亦不能拥有标签,但是它们可以有层级关系.您可将页面附属在另一个页面之下. 对应模板 ...
- css使input中的值自动变大写
<style type="text/css"> input { text-transform:uppercase; } </style>
- B、B*、B+
转自:http://blog.csdn.net/v_JULY_v/article/details/6530142 从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie. ...