zoukankan      html  css  js  c++  java
  • jzoj 5588 %%%

    Description

    给定整数n,m,求有多少个数对(i,j)满足1<=i,j<=n且i mod j>=m。
    有多组数据。
     

    Input

    第一行一个整数t表示数据组数。每组数据一行两个整数n,m。
    t<=100,0<=m<=n<=10^9。

    Output

    每组数据输出一行一个整数表示答案。

     Sol:  


     取反以后数论分块。

     code:

        

      

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    LL ans,n,m,pos,be,ed,epos,eval;
    int T;
    LL get1(LL l,LL r) {
        if (l<m&&r<m) return (l+r)*(r-l+1)/2;
        if (l<m&&r>=m) return (l+m)*(m-l+1)/2+(r-m)*m;
        return (r-l+1)*m;
    }
    LL get2(LL l,LL r) {
        m--;
        pos=n/l;
        be=n-pos*r; ed=n-pos*l;
        if (ed<=m) return m++,(r-l+1)*(be+ed)/2;
        epos=(n-m)/pos+((n-m)%pos>0?1:0); eval=n-pos*epos;
        return m++,(r-epos+1)*(be+eval)/2+(epos-l)*(m-1);
    }
    signed main () {
        freopen("mod.in","r",stdin);
        freopen("mod.out","w",stdout);
        scanf("%d",&T);
        while (T--) {
            scanf("%lld%lld",&n,&m); ans=0;
            if (m==0) {printf("%lld
    ",n*n); continue;}
            for (LL i=1,last;i<=n;i=last+1) {
                last=n/(n/i);
                ans+=n/i*get1(i,last);
                ans+=get2(i,last);
            }
            printf("%lld
    ",n*n-ans);
        } 
        return 0;
    }
  • 相关阅读:
    资源 | 辟谣平台
    数据分析常用思维
    数据分析常用工具
    杂谈 | 标准化和个性化
    杂谈 | 学以致用
    杂谈 | 工具思维的陷阱
    杂谈 | 习得性无助&习得性乐观
    spark连接mysql
    spark累加器
    java操作excel数据写入map集合并按照value排序
  • 原文地址:https://www.cnblogs.com/rrsb/p/9878860.html
Copyright © 2011-2022 走看看