zoukankan      html  css  js  c++  java
  • 【反演复习计划】【bzoj3529】数表

    Orz PoPoQQQ大爷

    按照他ppt的解法,这题可以划归到之前的题了OrzOrz

    跪wy写的题解(Stealth Assassin)https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P3312

     1 #include<bits/stdc++.h>
     2 #define N 100005
     3 #define fi first
     4 #define sc second
     5 using namespace std;
     6 typedef long long ll;
     7 int Q,maxn,cnt,prime[N],mu[N],d[N];
     8 int c[10*N],ans[N],vis[N];
     9 pair<int,int> f[N];
    10 struct Query{int n,m,a,id;}q[N];
    11 bool operator<(Query x,Query y){return x.a<y.a;}
    12 inline int lowbit(int x){return (x&(-x));}
    13 inline void add(int x,int val){
    14     for(int i=x;i<=maxn;i+=lowbit(i))c[i]+=val;
    15 }
    16 inline int query(int x){
    17     int ans=0;
    18     for(int i=x;i;i-=lowbit(i))ans+=c[i];
    19     return ans;
    20 }
    21 inline void calcmu(){
    22     cnt=0;memset(vis,1,sizeof(vis));mu[1]=1;
    23     for(int i=2;i<=maxn;i++){
    24         if(vis[i]){prime[++cnt]=i;mu[i]=-1;}
    25         for(int j=1;j<=cnt;j++){
    26             int t=prime[j]*i;if(t>maxn)break;
    27             vis[t]=0;
    28             if(i%prime[j]==0){mu[t]=0;break;}
    29             mu[t]=-mu[i];
    30         }
    31     }
    32     for(int i=1;i<=maxn;i++)
    33     for(int j=i;j<=maxn;j+=i)f[j].fi+=i;
    34     for(int i=1;i<=maxn;i++)f[i].sc=i;
    35 }
    36 inline void work(int x){
    37     int id=q[x].id,n=q[x].n,m=q[x].m;
    38     for(int i=1,j=1;i<=n;i=j+1){
    39         j=min(n/(n/i),m/(m/i));
    40         ans[id]+=(n/i)*(m/i)*(query(j)-query(i-1));
    41     }
    42 }
    43 inline int read(){
    44     int f=1,x=0;char ch;
    45     do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    46     do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    47     return f*x;
    48 }
    49 int main(){
    50     Q=read();
    51     for(int i=1;i<=Q;i++){
    52         q[i].n=read();q[i].m=read();q[i].a=read();q[i].id=i;
    53         if(q[i].n>q[i].m)swap(q[i].n,q[i].m);
    54         maxn=max(maxn,q[i].n);
    55     }
    56     calcmu();
    57     sort(q+1,q+Q+1);sort(f+1,f+maxn+1);int now=0;
    58     for(int i=1;i<=Q;i++){
    59         while(now+1<=maxn&&f[now+1].fi<=q[i].a){
    60             ++now;
    61             for(int j=f[now].sc;j<=maxn;j+=f[now].sc)
    62             add(j,f[now].fi*mu[j/f[now].sc]);
    63         }
    64         work(i);
    65     }
    66     for(int i=1;i<=Q;i++)printf("%d
    ",ans[i]&0x7fffffff);
    67     return 0;
    68 }
  • 相关阅读:
    C++ 用宏实现swap(a,b)
    C++ string类的实现
    博客园代码高亮Html转换小程序,Linux/Mac下可用
    C++STL
    数据结构课程设计(基于二叉排序树的身份证管理系统)
    简单模拟B1011
    简单模拟B1001
    双向链表的双向冒泡排序 c++
    IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现
    Java多人聊天室第一版
  • 原文地址:https://www.cnblogs.com/zcysky/p/6891246.html
Copyright © 2011-2022 走看看