格点统计

本文介绍了一种高效算法,用于计算坐标系中满足特定条件的坐标点数量。通过观察和分析,提出了一种通过枚举行数并利用对称性减少计算量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
这里写图片描述

Input
这里写图片描述

Output
这里写图片描述

Sample Input

输入1:
3
输入2:
4

Sample Output

输出1:
5
这里写图片描述

输出2:
8


Data Constraint
这里写图片描述
.
.
.
.
.
.
.
.

分析

这题就是让我们求,在一个坐标系里,有多少个坐标(x,y)相乘小于等于k,即:x*y<=k


当k=4时,所求点如下:
这里写图片描述
观察图,我们可以发现,对于第i行,它的个数是trunc(k/i),即k div i。
因此,我们可以枚举i(i=1 to k)来求ans,但由于k的数据过大,i=1 to k会超时。
.
.
.
.
让我们再仔细观察图 :
这里写图片描述
我们发现,当我们求出第一行时,第一列也会求出来
因此,我们有了一种想法:
枚举i( i=1 to trunc(sqrt(k)) )
每求出一行,就把数量乘2(因为会有重叠的地方,所以要减去重叠的地方乘2)累加

记得取模

.
.
.
.
.
.
.

程序:
var
k,ans:qword;
i:longint;
begin
    assign(input,'count.in');
    reset(input);
    assign(output,'count.out');
    rewrite(output);
    read(k);
    ans:=0;
    for i:=1 to trunc(sqrt(k)) do
    ans:=(ans+(trunc(k/i)-(i-1))*2-1) mod 998244353;
    write(ans);
    close(input);
    close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值