【0521模拟赛】小Z爱数学

题目描述

小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和。

小Z发现还是很水,所以他决定加大难度。

小Z还准备了很多个询问。现在你来解决一下吧。

输入输出格式

输入格式:

第一行两个整数m 表示询问的个数

接下来每行两个数ni,ki,表示这个询问的n和k

输出格式:

也就是把刚好等于k的答案加进去  然后k变大

对于每个询问输出一行一个整数,表示对应的答案。

题目理解:F(n,k)表示n的所有因数qi中,满足n/qi<=k的和,

m组,每组给定n和k,求       

m<=500000,ni<=100000

解析:k比较大的的答案  包含了k比较小的答案,所以要先把每次询问按k来排序,

然后我们每次回答询问的时候  如果k不同  就把k变大成现在要问的k,

也就是把刚好等于k的答案插入线段树, 然后k变大

复杂度 O (nlog^2n+mlogn)

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100000
#define ll long long
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
ll t[N*3],ans[N*5+10];
int m;
struct que{int n,k,id;}e[N*5+10];
bool cmp(que i,que j){return i.k<j.k;}
ll query(int l,int r){
    ll sum=0;
    l+=N-1,r+=N-1;
    sum+=t[l]+t[r];
    if(l==r) return sum-=t[l];
    for(;l^r^1;l>>=1,r>>=1){
        if(~l&1) sum+=t[l^1];
        if( r&1) sum+=t[r^1];
    }
    return sum;
}
void Change(int x,int v){
    t[x+=N-1]+=v;
    while(x) t[x>>=1]=t[x<<1]+t[x<<1|1];
}
void sol(int x){
    for(int i=1;i*x<=N;i++) Change(i*x,i);
}
int main(){
    m=read();
    for(int i=1;i<=m;i++){e[i].n=read();e[i].k=read();e[i].id=i;}
    sort(e+1,e+m+1,cmp);
    int j=0;
    for(int i=1;i<=m;i++){
        while(j<e[i].k) sol(++j);
        ans[e[i].id]=query(1,e[i].n);
    }
    for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
    return 0;
}
时间: 2024-08-03 04:49:34

【0521模拟赛】小Z爱数学的相关文章

小Z爱序列(NOIP信(sang)心(bin)赛)From Fall_Dream(粗制单调队列&amp;单调栈的算法解析)

原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件的点对的数量. 假设点对是(i , j),max(l,r)是[l,r]当中最大的ai的值. 这个点对满足条件当且仅当i+1<j 且 ai < max(i+1,j-1) < aj 为了简单,保证输入的是一个1-n的排列.相信你已经会做了吧? 输入/输出格式 输入数据第一行有一个数字n,然后第二

【洛谷T4896】小Z爱划水

题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他会产生1不满意度. 更棘手的是,他们之间一些人是朋友,如果两人是朋友,但是他们做的事情不同,那么会有1不满意度产生. 小Z不想看到大家闹得不高兴,他想知道,不满意度最小能是多少? 输入输出格式 输入格式: 第一行两个数字n,m 分别表示有n个人和m对朋友关系 第二行n个0/1,1表示想做题,0表示想

小Z爱划水

题目背景 小Z在机房. 题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他会产生1不满意度. 更棘手的是,他们之间一些人是朋友,如果两人是朋友,但是他们做的事情不同,那么会有1不满意度产生. 小Z不想看到大家闹得不高兴,他想知道,不满意度最小能是多少? 输入输出格式 输入格式: 第一行两个数字n,m 分别表示有n个人和m对朋友关系 第二行n个0/1

[noip模拟赛]小U的女装

https://www.zybuluo.com/ysner/note/1329304 题面 有一张\(n\)点\(m\)边的.不一定联通的无向图. 如果选了一条边,就不能选其两个端点. 现在同时选点和边,那么最多能够选的点边数量和为多少. 同时,回答使点边数最大的方案数. \(n\leq10^5,m\leq3*10^5\) 解析 设答案为\(ans\),方案数为\(tot\). 讨论一下联通块的形态: \(m=n-1\):\(ans=n,tot=1\) \(m=n\):\(ans=m\),环中\

【CSP模拟赛】方程(数学)

题目描述 求关于x的方程:x1+x2+……xk=n的非负整数解的个数. 输入格式 仅一行,包含两个正整数n,k. 输出格式 一个整数,表示方程不同解的个数,这个数可能很大,你只需输出mod 20080814 的结果. 输入样例 1 1 输出样例 1提示数据范围对于50%的数据,n,k<=300对于80%的数据,n,k<=1000对于100%的数据,n,k<=100000 分析 第一眼看这不是结论题吗?直接就是C(n+k-1,n-1). 然后一看模数是个偶数,瞬间懵逼 最后直接赌命暴力分解

CONTEST36 小Z的模拟赛(2)

A.小Z的可恶路障 题目:http://www.luogu.org/problem/show?pid=U126 题解:暴力也可以过吧.我为了保险先求了一次最短路,然后枚举这条最短路上的所有边... 代码: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream&

[高精度][数学] Jzoj P3771 小Z的烦恼

Description 小 Z 最近遇上了大麻烦,他的数学分析挂科了.于是他只好找数分老师求情. 善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1-n 的球和 m 个盒子,每个球都可以放进且只能放进一个盒子里面,但是要满足如下的规则: 1.  若把标号为 i 的球放进了第 j 个盒子,那么标号为 2*i 的球一定要在第 j+1 个盒子里面(若 j<m) 2.  若把标号为 i 的球放进了第 j 个盒子,并且 k*2=i,那么标号为 k 的球一

lzoi模拟赛题解

A题:签到题原题:mtoi 联赛 的A题定位:真.签到题(普及B题或者提高d1A题)考点:选手的基本数学能力思维难度:提高-代码难度:普及A题 题解:80%:暴力枚举100%:注意到(a xor b)<=(a+b),于是把所有的数异或起来即可. B题:送分题原题:[多省省队联测]d2A:皮配定位:一道联赛d1B题,考察了选手的基本功.送了选手70分.把70%的2种做法扩展可以得到正解考点:多种背包dp,计数思维难度:提高代码难度:提高+ 前面的几个数据可以暴力枚举解决.50%的数据:考虑dp.设

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro