zoukankan      html  css  js  c++  java
  • bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举

     1257: [CQOI2007]余数之和sum

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 1779  Solved: 823
    [Submit][Status]

    Description

    给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

    Input

    输入仅一行,包含两个整数n, k。

    Output

    输出仅一行,即j(n, k)。

    Sample Input

    5 3

    Sample Output

    7

    HINT

    50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9

      segma(n%x)=segma(n-n/x*x)=n*k-segma(n/x*x)

      很容易发现,当我们枚举x计算n/x时,当x较大时,大量x对应相同的n/x,则我们可以枚举n/x,从1至sqrt(n),只枚举一半是因为当n/x较大时,很多n/x并没有相应x对应,所以由于之前枚举n/x处理了区间[x0,k]的x,那么我们就可以枚举[1,x0-1]中的x,两种方法即可在sqrt(n)时间内解决问题。

     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define MAXN 10000
    typedef long long qword;
    int main()
    {
            freopen("input.txt","r",stdin);
            int n,m;
            scanf("%d%d",&m,&n);
            int i,j,k;
            qword x0,x1;
            qword ans=(qword)n*m;
            int l=floor(sqrt(n));
            for (i=0;i<=l;i++)
            {
                    //n%x=n-n/x*x
                    //n/x=i
                    if (i==0)
                            x1=m;
                    else 
                            x1=min(m,n/i);
                    x0=n/(i+1)+1;
                    if (x0>x1)
                            continue;
                    ans-=(qword)i*(x0+x1)*(x1-x0+1)/2;
            }
            for (i=1;i<min(m+1,(int)x0);i++)
            {
                    ans-=n/i*i;
            }
            printf("%lld
    ",ans);
    }
    by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载

    本博客已停用,新博客地址:http://mhy12345.xyz

  • 相关阅读:
    软件工程第一次作业
    7.9-7.22日团队进展及博客更新状况
    2018 软件工程暑期培训小结
    结对编程(第7组)
    6.3日前团队项目打分情况
    第六周实践作业:软件测试和评估
    第4周小组作业:WordCount优化
    第2周个人作业:WordCount
    博客阅读和思考
    个人总结
  • 原文地址:https://www.cnblogs.com/mhy12345/p/3958437.html
Copyright © 2011-2022 走看看