zoukankan      html  css  js  c++  java
  • 51Nod1678 lky与gcd

    题目看这里

    本来以为是一个离线做的题目结果发现数据小可乱搞

    预处理f[i]表示Σa[ki],预处理每个i的因子集合s[i]

    每次修改位置i,即为将所有的f[s[i]]都修改

    每次求和,答案为Σmu[i]*f[i]     mu为莫比乌斯函数

    复杂度O(n√n)

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<vector> 
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 100000
    using namespace std;
    vector<int> s[100010];
    int n,m,f[100010],v[100010],w[100010],t,mu[100010]; bool vis[100010];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i) scanf("%d",v+i); mu[1]=1;
        for(int i=2;i<=n;++i){
            if(!vis[i]) mu[w[++t]=i]=-1;
            for(int j=1;j<=t && i*w[j]<=n;++j){
                vis[i*w[j]]=1;
                if(i%w[j]==0){ mu[i*w[j]]=0; break; }
                mu[i*w[j]]=-mu[i];
            }
        }
        for(int i=1;i<=n;++i)
            for(int j=i;j<=n;j+=i) f[i]+=v[j],s[j].push_back(i);
        for(int o,x;m--;){
            scanf("%d%d",&o,&x);
            if(o==1){
                scanf("%d",&o);
                for(int i=0;i<s[x].size();++i) f[s[x][i]]+=o-v[x];
                v[x]=o;
            } else {
                o=0;
                for(int i=0;i<s[x].size();++i) o+=f[s[x][i]]*mu[s[x][i]];
                printf("%d
    ",o);
            }
        }
    }

  • 相关阅读:
    web 开发之酷炫--- 酷炫展示
    攻城狮的体检
    科技发烧友之智能路由
    科技发烧友之3d吉米投影
    科技发烧友之单反佳能700d中高端
    上海
    视频会议
    机器学习之信息
    filter
    centos 20T硬盘(超过16T)分区
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477126.html
Copyright © 2011-2022 走看看