搬运题解
Claris:
1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$

$\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=&v[\gcd(\frac{x}{d},\frac{n}{d})=1]\\&=&v\sum_{k|\gcd(\frac{x}{d},\frac{n}{d})}\mu(k)\\&=&\sum_{k|\frac{n}{d},dk|x}v\mu(k)\end{eqnarray*}$
设 $a[i]=\sum_{j|i}f[j]$
则每次修改相当于枚举$k|\frac{n}{d}$,然后给$f[dk]+=v\mu(k)$
查询$x=\sum_{i=1}^x a[i]=\sum_{i=1}^x\sum_{d|i}f[d]=\sum_{d=1}^x f[d]\frac{x}{d}$
可以分块统计,用树状数组维护f[]的前缀和

大概维护一个数列
支持
1.对所有x的倍数的位置加上v
2.查询前缀和
可以用分块的方法把复杂度降为$n\sqrt{n}logn$

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#define ll long long
#define pb(x) push_back(x)
#define N 200005
using namespace std;
int n,q;
int su[N],tot,pr[N],miu[N];
const int inf = 200000;
vector<int>v[N];
void shai()
{
miu[1]=1;
for(int i=1;i<=inf;i++)v[i].pb(1);
for(int i=2;i<=inf;i++)
{
if(!pr[i])
{
pr[i]=i;
su[++tot]=i;
miu[i]=-1;
}
for(int j=1;j<=tot&&su[j]*i<=inf;j++)
{
pr[su[j]*i]=su[j];
if(su[j]==pr[i])
{
break;
}
else miu[su[j]*i]=-miu[i];
}
for(int j=i;j<=inf;j+=i)v[j].pb(i);
}
return ;
}
ll c[N];
void add(int x,int z)
{
for(int i=x;i<=n;i+=(i&(-i)))
{
c[i]+=z;
}
return ;
}
ll qur(int x)
{
ll ans=0;
for(int i=x;i;i-=(i&(-i)))
{
ans+=c[i];
}
return ans;
}
int main()
{
shai();int cnt=0;
while(~scanf("%d%d",&n,&q))
{
if(!n&&!q)break;
printf("Case #%d:\n",++cnt);
for(int i=1;i<=n;i++)c[i]=0;
int t1,t2,t3,t4;
for(int i=1;i<=q;i++)
{
scanf("%d",&t1);
if(t1==1)
{
scanf("%d%d%d",&t2,&t3,&t4);
if(t2%t3!=0)continue;
int num=t2/t3;
for(int j=0;j<v[num].size();j++)
{
int k=v[num][j];
add(k*t3,miu[k]*t4);
}
}
else
{
scanf("%d",&t2);
ll ans=0;int r;
for(int l=1;l<=t2;l=r+1)
{
r=t2/(t2/l);
ans+=1LL*(t2/l)*(qur(r)-qur(l-1));
}
printf("%lld\n",ans);
} } }
return 0;
}

  

bzoj 3853 : GCD Array的更多相关文章

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

    GCD Array Time Limit: 11000/5500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. bzoj 2818 GCD 数论 欧拉函数

    bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...

  3. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  4. BZOJ 2818: Gcd

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4443  Solved: 1960[Submit][Status][Discuss ...

  5. BZOJ3853 : GCD Array

    1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$ \[\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=&v[\gcd(\fr ...

  6. bzoj 2818: Gcd GCD(a,b) = 素数

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1566  Solved: 691[Submit][Status] Descript ...

  7. bzoj 2818: Gcd 歐拉函數

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1633  Solved: 724[Submit][Status] Descript ...

  8. Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3241  Solved: 1437[Submit][Status][Discuss ...

  9. BZOJ 2818 GCD(欧拉函数)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37161 题意:gcd(x, y) = 质数, 1 <= x, ...

随机推荐

  1. mv命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/piaozhe116/p/6084214.html mv命令是move的缩写,可以用来移动文件或者将文件改名(move ...

  2. unload没有用

    今天下午测试了unload这个事件包括beforeunload <script type="text/javascript"> window.addEventListe ...

  3. 如何使用g++编译调用dll的c++代码

    本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ...

  4. java把map转json

    JSONUtils.toJSONString(requestMap);    com.alibaba.fastjson.JSON <!-- https://mvnrepository.com/a ...

  5. Notes of Scrum Meeting(2014/11/2)

    Notes of Scrum Meeting (2014/11/2) 软件工程项目组Sevens开始项目之后的第一次Scrum Meeting报告 会议时间:2014年11月2日  20:00—20: ...

  6. cron延时

    2)Cron表达式范例: 每隔5秒执行一次:*/5 * * * * ? 每隔1分钟执行一次:0 */1 * * * ? 每天23点执行一次:0 0 23 * * ? 每天凌晨1点执行一次:0 0 1 ...

  7. Aspose 插件

    百度:Aspose Aspose.Cells.dll Aspose.Slides.dll Aspose.Words.dll

  8. js一些常用方法总结

    这两天开始在牛客网上做一些js在线编程,发现很多编程题其实调用的js方法都差不多一样,所以觉得可以汇总一下,方便记忆也可以多多熟悉. 1.slice()方法 这个方法就是可以从已有的数组中返回选定的元 ...

  9. 数据库:XML,解析Dom4J

    package com.itheima.util; import java.io.FileOutputStream; import java.net.URL; import org.dom4j.Doc ...

  10. iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件上传

    官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目   •2. 或使用Cocopod 导入AFNetworking3.0+   •3.  引入 ...