1678 lyk与gcd 

基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

 收藏

 关注

这天,lyk又和gcd杠上了。

它拥有一个n个数的数列,它想实现两种操作。

1:将  ai 改为b。

2:给定一个数i,求所有 gcd(i,j)=1 时的  aj  的总和。

Input

第一行两个数n,Q(1<=n,Q<=100000)。
接下来一行n个数表示ai(1<=ai<=10^4)。
接下来Q行,每行先读入一个数A(1<=A<=2)。
若A=1,表示第一种操作,紧接着两个数i和b。(1<=i<=n,1<=b<=10^4)。
若B=2,表示第二种操作,紧接着一个数i。(1<=i<=n)。

Output

对于每个询问输出一行表示答案。

Input示例

5 3
1 2 3 4 5
2 4
1 3 1
2 4

Output示例

9
7

看了讨论区才会做。。。

#include<bits/stdc++.h>

using namespace std;

const int MAX_N=1000051;

int prime[MAX_N];//素数表

bool is_prime[MAX_N+1];

//返回n以内的素数的个数

int sieve(int n)

{

    int p=0;

    for(int i=0;i<=n;i++)is_prime[i]=true;

    is_prime[0]=is_prime[1]=false;

    for(int i=2;i<=n;i++)

    {

        if(is_prime[i])

        {

            prime[p++]=i;//素数打表

            for(int j=2*i;j<=n;j+=i)is_prime[j]=false;//去掉已有素数的倍数

        }

    }

    return p;

}

int n,q;

int a[100005];

int A;

int sum=0;

int primecnt;

int val[100005];//val [x] = y 表示对于含有x因子的下标的数值总和为y

vector<int>v;

void update(int x,int y)//更新

{

    sum-=a[x];

    for(int i=1;i*i<=x;i++)

    {

        if(x%i==0)

        {

            if(i*i!=x)

            val[x/i]+=y-a[x];

            val[i]+=y-a[x];

        }

    }

    a[x]=y;

    sum+=a[x];

}

void getprime(int n)//素因子分解

{

    v.clear();

    int temp,i,now;

    temp=(int)((double)sqrt(n)+1);

    now=n;

    for(i=2;i<=temp;++i)if(now%i==0){

        v.push_back(i);

        while(now%i==0){

            now/=i;

        }

    }

    if(now!=1){

        v.push_back(now);

    }

}

int query(int x)

{

    getprime(x);

    int res=0,len=v.size();

    for(int i=1;i<(1<<len);i++)//枚举所有非空子集

    {

        int cnt=0,t=1;

        for(int j=0;j<len;j++)

        {

            if(i&(1<<j))

            {

                t*=v[j];

                cnt++;

            }

        }

        //容斥原理计数,若集合大小为奇数,则加上,否则减掉

        if(cnt&1)

        res+=val[t];

        else

        res-=val[t];

    }

    return res;

}

int main()

{

    #ifndef ONLINE_JUDGE

        freopen("in.txt","r",stdin);

    #endif // ONLINE_JUDGE

        primecnt=sieve(1000050);

      scanf("%d%d",&n,&q);

      for(int i=1;i<=n;i++)

      {

          scanf("%d",&a[i]);sum+=a[i];

      }

//初始化val数组

      for(int i=1;i<=n;i++)

        for(int j=1;i*j<=n;j++)

            val[i]+=a[i*j];

int i,b;int ans=0;

      while(q--)

      {

          scanf("%d",&A);

          if(A==1)

          {

              scanf("%d%d",&i,&b);

              update(i,b);

          }

          else

          {

              scanf("%d",&i);

              ans=query(i);

              printf("%d\n",sum-ans);

          }

      }

}

51 Nod 1678 lyk与gcd(容斥原理)的更多相关文章

  1. 51 Nod 1678 lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai  ...

  2. 51nod 1678 lyk与gcd | 容斥原理

    51nod 200题辣ψ(`∇´)ψ !庆祝! 51nod 1678 lyk与gcd | 容斥原理 题面 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为 ...

  3. 1678 lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai 改为b.2:给定一个数i,求所有 ...

  4. [51nod]1678 lyk与gcd(莫比乌斯反演)

    题面 传送门 题解 和这题差不多 //minamoto #include<bits/stdc++.h> #define R register #define pb push_back #d ...

  5. 51nod lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai  ...

  6. 51nod1678 lyk与gcd

    容斥定理所以可以用莫比乌斯函数来搞.逆向思维答案等于总和减去和他互质的.那么设f[i]=∑a[j] i|j.ans[i]=sum- ∑mo[j]*f[j] 跟bzoj2440那道题挺像的都是利用莫比乌 ...

  7. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  8. 51 nod 1610 路径计数(Moblus+dp)

    1610 路径计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图.T次修改操作,每次修改一 ...

  9. 51 nod 1188 最大公约数之和 V2

    1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 分值: 160 难度:6级算法题   给出一个数N,输出小于等于N的所有数,两两之间的最大公约数 ...

随机推荐

  1. python关键字以及含义,用法

    Python常用的关键字   1.and , or and , or 为逻辑关系用语,Python具有短路逻辑,False and 返回 False 不执行后面的语句, True or 直接返回Tru ...

  2. 洛谷 P1472 奶牛家谱 Cow Pedigrees 题解

    题面 这道题我觉得是个不错的题: 根据题意可以较清晰的发现ans只和n和k有关:(因为输入的只有这两个数啊~): 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并 ...

  3. linux 终端的用户与主机名

    首先这个属于Linux中的$PS1的变量,你可以通过 echo $PS1查看你当前的变量值. 默认的PS1变量值是 [\u@\h \W]\$,每个参数的含义 "root":表示当前 ...

  4. mysql整理-常用sql语句

    一.常用sql show variables like 'character_set_client';#查询字符集 show databases;#列出所有的服务器上的数据库alter create ...

  5. 03-Spring基于xml的IOC配置--spring的依赖注入

    1.概念 依赖注入:Dependency Injection(简称DI注入).它是 spring 框架核心 ioc 的具体实现. 简单理解:可以在一个类中不通过new的方式依赖其它对象.目的是为了解耦 ...

  6. 表格强制换行 table-layout:fixed

    如果想要一个table固定大小,里面的文字强制换行(尤其是在一长串英文文本,并且中间无空格分隔的情况下),以达到使过长的文字不撑破表格的目的,一般是使用样式:table-layout:fixed.

  7. js对时间戳的处理 获取时间,昨天,今天,明天,时间不同格式

    1.获取昨天,今天,明天的时间 //昨天的时间 var day1 = new Date(); day1.setTime(day1.getTime()-24*60*60*1000); var s1 = ...

  8. 微信小程序 setData动态设置数组中的数据

    setdata传递动态数据值必须为对象(只能是key:value) 语法如下 this.setData({ filter: 1212 }) 如果setdata要传递数组呢? 首先相到的是 this.s ...

  9. linux centos中安装flash player

    本机为centos 7.0 64 1.用火狐浏览器随便打开一个视频网站,找到一个视频点进去,网站会提示未安装flash player.点击进去到adobe官网.2.下载flash player插件,可 ...

  10. Linux RAID磁盘阵列

    RAID磁盘阵列 什么是RAID RAID是磁盘阵列的英文缩写,多块磁盘组成了一个组合,一起完成存储任务,就是磁盘阵列. RAID几种常用的类别(组合) RAID0:条带卷:最低磁盘个数2+,空间利用 ...