[Sdoi2014]数表

news/2024/7/24 13:39:35

 

2133. [SDOI2014] 数表

★★★☆   输入文件:sdoi2014shb.in   输出文件:sdoi2014shb.out   简单对比
时间限制:5 s   内存限制:512 MB

【题目描述】

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

【输入格式】

输入包含多组数据。输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。

【输出格式】

对每组数据,输出一行一个整数,表示答案模2^31的值。

【样例输入】

 

2

4 4 3

10 10 5

 

【样例输出】

 

20

148

 

【来源】

SDOI2014day1

 

2017-03-07 21:33:54

终于把坑填起来了。

//COGS RANK1
#include<cstdio>
#include<algorithm>
#define pir pair<int,int>
#define fi first
#define se second
#define EF if(ch==EOF) return EOF;
#define EX if(ch==EOF) return x*f;
using namespace std;
const int N=1e5+5;
struct node{int n,m,a,id;}q[N];
int T,tot,mx,prime[N/3],mu[N],BIT[N],ans[N];
bool check[N];pir F[N];
inline int read(){
    int x=0,f=1;char ch=getchar();EF
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();EF}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();EX}
    return x*f;
}
inline bool operator <(const node &a,const node &b){
    return a.a<b.a;
}
inline int lowbit(int x){
    return x&-x;
}
inline void update(int x,int v){
    for(int i=x;i<=mx;i+=lowbit(i)) BIT[i]+=v;
}
inline int query(int x){
    int res=0;
    for(int i=x;i;i-=lowbit(i)) res+=BIT[i];
    return res;
}
void prepare(){
    mu[1]=1;
    for(int i=2;i<=mx;i++){
        if(!check[i]) prime[++tot]=i,mu[i]=-1;
        for(int j=1;j<=tot&&prime[j]*i<=mx;j++){
            check[prime[j]*i]=1;
            if(i%prime[j]==0){mu[prime[j]*i]=0;break;}
            else mu[prime[j]*i]=-mu[i];
        }
    }
    for(int i=1;i<=mx;i++){
        for(int j=i;j<=mx;j+=i){
            F[j].fi+=i;
        }
    }
    for(int i=1;i<=mx;i++) F[i].se=i;
}
inline void solve(int mom){
    int id=q[mom].id,n=q[mom].n,m=q[mom].m;
    for(int i=1,pos;i<=n;i=pos+1){
        pos=min(n/(n/i),m/(m/i));
        ans[id]+=(n/i)*(m/i)*(query(pos)-query(i-1));
    }
}
int main(){
    freopen("sdoi2014shb.in","r",stdin);
    freopen("sdoi2014shb.out","w",stdout);
    T=read();
    for(int i=1;i<=T;i++){
        q[i].n=read();q[i].m=read();q[i].a=read();q[i].id=i;
        if(q[i].n>q[i].m) swap(q[i].n,q[i].m);
        mx=max(mx,q[i].n);
    }
    prepare();
    sort(q+1,q+T+1);
    sort(F+1,F+mx+1);
    int now=0;
    for(int i=1;i<=T;i++){
        while(now+1<=mx&&F[now+1].fi<=q[i].a){
            now++;
            for(int j=F[now].se;j<=mx;j+=F[now].se){
                update(j,F[now].fi*mu[j/F[now].se]);
            }
        }
        solve(i);
    }
    for(int i=1;i<=T;i++) printf("%d\n",ans[i]&0x7fffffff);
    return 0;
}

 

转载于:https://www.cnblogs.com/shenben/p/6407852.html


http://www.niftyadmin.cn/n/1126753.html

相关文章

SQL Server 把image字段导出成文件(SQL Server把image字段导入导出)

bcp 实现二进制文件的导入导出SQL SERVER 分类:程序资料2007.11.21 15:23 作者&#xff1a;suton | 评论&#xff1a;0 | 阅读&#xff1a;462 if exists (select * from dbo.sysobjects where id object_id(N[dbo].[p_binaryIO]) and OBJECTPROPERTY(id, NIsProcedure) 1) …

jquery实现抽奖小游戏

在很多网站或游戏活动中我们都会看到有关抽奖的活动或界面&#xff1b; 下面我将给大家介绍下如何通过javascript来实现这样的一个抽奖功能&#xff0c;主要从下面三个步骤入手&#xff08;文中着重介绍第三部分有关功能的实现&#xff09;&#xff1a; 1.先设置一个简单的抽奖…

固定层样式

固定层样式 作用&#xff1a;让层一直在右下角 position:fixed;right:0px; bottom: 0px;

TCP连接优化

当我们在浏览器上点开一个网页时&#xff0c;我们的客户端就会和服务器建立一个socket连接。Soket是什么&#xff0c;什么是Socket 五元组&#xff0c;常见的TCP优化参数的依据又是什么&#xff0c;这里我们将来分析一下。Socket 五元组我们通常所说的五元组就是我们熟悉的 源I…

态度决定一切——记2007中国之队亚洲杯出局

中国足球又一次在"打平就出线"的旗帜下跌得鼻青脸肿,我想中国球迷的心应该颇显平静,失望多了就无所谓了,即使把国足骂成猪相信也不是出于感情的冲动,更多的是一种看客的嚼舌。就好像一只好死不如赖活的狗在路边拾到一块肉被一旁冲出来的中亚狼抢了一样&#xff0c;旁…

手机SD卡根目录在哪里

sd卡根目录其实指的就是sd卡的第一层&#xff0c;也就是打开sd卡后所在的界面。当打开手机的sd卡存储界面后&#xff0c;所看到的界面就是sd卡的根目录。而当SD卡插在电脑上时&#xff0c;举个例子&#xff0c;如果插入电脑端的sd卡显示的是【I】盘&#xff0c;那么sd卡根目录指…

使用http module 对url进行重写的尝试

因为一些原因&#xff0c;要将原来两个独立的站点(假设为dh.site.com和cd.site.com)放到同一个站点的两个application下&#xff0c;分别为(www.site.com/dh和www.site.com/cd)。 因为在开发的时候&#xff0c;大部分静态文件的引用路径都是采用绝对路径的形式&#xff0c;例如…

后MVC时代的前端架构

很多人觉得&#xff0c;前后端的差异主要是分别承载了数据和样式&#xff0c;功能和皮肤。前端就是视觉方面的&#xff0c;后端是实质性的。追溯到很多年前&#xff0c;确实是这样的&#xff0c;所谓的前端只是由于后端MVC中的View过于复杂&#xff0c;为了提升用户体验&#x…