当前位置: 首页 > news >正文

bzoj千题计划205:bzoj3529: [Sdoi2014]数表

http://www.lydsy.com/JudgeOnline/problem.php?id=3529

 

有一张n*m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。

20000 组询问  n<=1e5

 

f(k)表示 k 的 约数和

g(k)表示 

f(k)的求法:

http://www.cnblogs.com/TheRoadToTheGold/p/8228969.html

g(k)的求法:

http://www.cnblogs.com/TheRoadToTheGold/p/6609495.html

 

假设没有a的限制

不妨令n<=m

 令i*d=t,把后面两个下取整提到前面

预处理出F(t),除法分块便可以在O(sqrt(n))求解

但是现在有f(i)<=a 的限制

离线处理,读入所有的询问

所以把f(i)按f(i)的值从小到大排序

询问按a的值从小到大排序

用树状数组维护当前F(t)的值

在处理这个询问之前

找出所有<=本次询问a的f(i)

在树状数组中i及i的倍数位置加上f(i)

 

取模不用管,自然溢出即可 

 

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

#define N 100001
#define M 20001

typedef long long LL;

int T;

int miu[N];

int p[N];
bool vis[N];

struct nodef
{
    int d,val;
}f[N];
int c[N];

bool cmpf(nodef A,nodef B)
{
    if(A.val!=B.val) return A.val<B.val;
    return A.d<B.d;
}

struct Query
{
    int id;
    int n,m,a;
}Q[M];

bool cmpQ(Query A,Query B)
{
    return A.a<B.a;
}

int ans[M];

struct BIT
{
    int s[N];
    
    #define lowbit(x) x&-x
    
    void add(int x,int val)
    {
        while(x<N-1)
        {
            s[x]=s[x]+val;
            x+=lowbit(x);
        }
    }
    
    int query(int x)
    {
        int sum=0;
        while(x)
        {
            sum=sum+s[x];
            x-=lowbit(x);
        }
        return sum;
    }
    
}Bit;

void read(int &x)
{
    x=0; int f=1; char c=getchar();
    while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); }
    while(isdigit(c))  { x=x*10+c-'0'; c=getchar(); }
    x*=f;
}

void pref()
{
    int cnt=0;
    miu[1]=1;
    f[1].d=1;
    f[1].val=1;
    for(int i=2;i<N;++i)
    {
        f[i].d=i;
        if(!vis[i])
        {
            p[++cnt]=i;
            miu[i]=-1;
            f[i].val=i+1;
            c[i]=1;
        }
        for(int j=1;j<=cnt;++j)
        {
            if(i*p[j]>=N) break;
            vis[i*p[j]]=true;
            if(i%p[j]==0)
            {
                f[i*p[j]].val=f[i].val*p[j]+c[i];
                c[i*p[j]]=c[i];
                break;
            }
            miu[i*p[j]]=-miu[i];
            f[i*p[j]].val=f[i].val*(p[j]+1);
            c[i*p[j]]=f[i].val;
        }
    }
    sort(f+1,f+N,cmpf);
}

void init()
{
    read(T);
    for(int i=1;i<=T;++i)
    {
        read(Q[i].n);
        read(Q[i].m);
        read(Q[i].a);
        Q[i].id=i;
    }
    sort(Q+1,Q+T+1,cmpQ);
}

void solve()
{
    int nowQ=1;
    while(Q[nowQ].a<=0) nowQ++;
    int nowd=1;
    int j,res;
    int tot,lastsum,nowsum;
    for(;nowQ<=T;++nowQ)
    {
        while(nowd<N && f[nowd].val<=Q[nowQ].a)
        {
            for(int i=f[nowd].d;i<N;i+=f[nowd].d)
                Bit.add(i,f[nowd].val*miu[i/f[nowd].d]);
            nowd++;
        }
        if(Q[nowQ].n>Q[nowQ].m) swap(Q[nowQ].n,Q[nowQ].m);
        tot=lastsum=0;
        for(int i=1;i<=Q[nowQ].n;i=j+1)
        {
            j=min(Q[nowQ].n/(Q[nowQ].n/i),Q[nowQ].m/(Q[nowQ].m/i));
            nowsum=Bit.query(j);
            res=nowsum-lastsum;
            res=res*(Q[nowQ].n/i)*(Q[nowQ].m/i);
            tot+=res;
            lastsum=nowsum;
        }
        tot+= tot<0 ? 1LL<<31 : 0;
        ans[Q[nowQ].id]=tot;
    }
    for(int i=1;i<=T;++i) cout<<ans[i]<<'\n';
}

int main()
{
    pref();
    init();
    solve();
}

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8241930.html

相关文章:

  • 关于多线程的参数问题
  • sudo、磁盘结构、echo,awk,python计算、RAID0和1的区别
  • jsp页面按时间排序
  • 18载艰苦创业,曾动念房地产转型,讯飞的江湖夜雨和桃李春风
  • UML--------------------类图
  • 如何使用MACS进行peak calling
  • 使用mysqladmin命令修改MySQL密码与忘记密码
  • text-decoration与color属性
  • reactive streams与观察者模式
  • 面试技术题笔记
  • 从String源码看Java中的编码
  • 怎样让html加载完毕后加载js代码
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Vmware虚拟机的单用户模式
  • Flask学习笔记(2)-login_page
  • es的写入过程
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JS实现简单的MVC模式开发小游戏
  • React+TypeScript入门
  • react-native 安卓真机环境搭建
  • Vue小说阅读器(仿追书神器)
  • 前端面试之CSS3新特性
  • 小程序01:wepy框架整合iview webapp UI
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • RDS-Mysql 物理备份恢复到本地数据库上
  • (1)Android开发优化---------UI优化
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2020)Java后端开发----(面试题和笔试题)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (十六)一篇文章学会Java的常用API
  • (十三)Flask之特殊装饰器详解
  • (五)关系数据库标准语言SQL
  • (转)socket Aio demo
  • .axf 转化 .bin文件 的方法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET gRPC 和RESTful简单对比
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 获取url的方法
  • .net 怎么循环得到数组里的值_关于js数组
  • .net对接阿里云CSB服务
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net与java建立WebService再互相调用
  • .php文件都打不开,打不开php文件怎么办
  • @Data注解的作用
  • @RequestMapping处理请求异常
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [Android]常见的数据传递方式
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [Swift]RxSwift常见用法详解
  • [UDS] --- RoutineCommunicationControl 0x31
  • [VTK]基于VTK的三维重建
  • [Vue安装教程]十分钟学会vue 安装
  • [WeChall] Prime Factory (Training, Math) 的解决方法