专栏首页奇妙的算法世界河南CCPC省赛 咕咕的计数题 II(打表找规律)

河南CCPC省赛 咕咕的计数题 II(打表找规律)

题意描述

思路

打表发现,当数字大于 a ∗ a a*a a∗a时,每个数字都符合条件。小于 a ∗ a a*a a∗a时,符合条件的个数为一个等差数列。我们可以用类似前缀和方法来计算 [ l , r ] [l,r] [l,r]区间内的个数,即 [ 1 , r ] − [ 1 , l − 1 ] [1,r]-[1,l-1] [1,r]−[1,l−1]。发现,如果当前区间的右端点不能覆盖所有情况,则可以分为两部分计算:该区间前的区间和在端点覆盖内的该区间的数字。

AC代码

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <set>
#include <stack>
#include <iomanip>
#include <unordered_map>
#define x first
#define y second
#define PB push_back
#define mst(x,a) memset(x,a,sizeof(x))
#define all(a) begin(a),end(a)
#define rep(x,l,u) for(ll x=l;x<u;x++)
#define rrep(x,l,u) for(ll x=l;x>=u;x--)
#define sz(x) x.size()
#define IOS ios::sync_with_stdio(false);cin.tie(0);
#define seteps(N) setprecision(N)
#define lson (ind<<1)
#define rson (ind<<1|1)
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<char,char> PCC;
typedef long long ll;
typedef pair<ll,ll> PLL;
typedef __int128 lll;
constexpr int N=505;
constexpr int M=1e6+10;
constexpr int INF=0x3f3f3f3f;
constexpr int mod=1e9+7;
ll l,r,a;
ll cal(ll n){
    if(!n) return 0;
    ll u,ans=0;
    u=n/a;
    if(u>=a){
        ans+=n-a*a+1;
        n=a*a-1;
    }
    u=n/a;
    if(n>=u*a+u-1){
        ans+=(1+u)*u/2;
    }else{
        u--;
        ans+=(1+u)*u/2;
        ans+=n-(u+1)*a+1;
    }
    return ans;
}
void solve(){
    scanf("%lld%lld%lld",&a,&l,&r);
    printf("%lld\n",cal(r)-cal(l-1));
}
signed main(){
    //IOS;
    //freopen("test.in", "r", stdin);
    //freopen("test.out", "w", stdout);
    int t;scanf("%d",&t);
    while(t--)
        solve();
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • POJ 2493 (map)

    给定有n个词的字典和m个句子,每个词语除首位和末位的字母可以任意移动,求能够构成m个句子的总共不同情况有多少

    dejavu1zz
  • 树状数组求逆序对以及相关例题

    求逆序对有两种方法:归并排序和树状数组,但是归并排序求得的逆序对是总共的逆序对数量,有些时候我们需要求得某个数后面的逆序对数量或者某个数前面的逆序对数量。

    dejavu1zz
  • 树状数组求逆序对以及相关例题

    求逆序对有两种方法:归并排序和树状数组,但是归并排序求得的逆序对是总共的逆序对数量,有些时候我们需要求得某个数后面的逆序对数量或者某个数前面的逆序对数量。

    dejavu1zz
  • Linux 改变文件大小的方法

    函数ftruncate会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。如果原来的文件大...

    砸漏
  • ABC108C - Triangular Relationship(打表)

    给出$n, k$,求出满足$a+b, b + c, c + a$都是$k$的倍数的三元组$a, b, c$的个数,$1 \leqslant a, b, c \l...

    attack
  • 在linux下玩转带有超时时间的connect函数

    在之前的文章中,我们在Windows下玩过带有超时时间的,本文我们在linux下来玩。在某次面试中,还被遇到了这个问题,有意思。

    砸漏
  • 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--A-跳台阶

    链接:https://www.nowcoder.com/acm/contest/90/A 来源:牛客网

    Enterprise_
  • 数据蒋堂 | 多维分析预汇总的方案探讨

    本文共1300字,建议阅读6分钟。 本文与你探讨多维分析初始状态时该预先汇总哪些组合。

    数据派THU
  • pcl1.8 vs2.13 qt5.7实现点云显示

    好吧,虽然转载了别人的博客,那个步骤确实是我想要的,还挺详细,但是考虑到别人可能会将其删除等原因,还是自己写篇日志,记录下。(PS:弄这个东西搞了快3个月的时...

    点云PCL博主
  • 两段有趣的C代码

    看起来没啥用的内容。 不过在你需要的文本内容比较长,不想直接复制在源代码里面的时候,其实就可以考虑这种方式了。

    编程珠玑

扫码关注云+社区

领取腾讯云代金券