• bzoj 1257: [CQOI2007]余数之和sum


    这是个神题233(一开始想的也差不多,然而不知道为什么觉得复杂度不对,(没想到等差数列,就GG掉了))

    一个数k,k/x=y...?,?构成等差数列,直接o(1)解决,每得出一个y的区间,是[i,last](last见程序,至于为什么,写写看看,挺显然的)

     1 #include<bits/stdc++.h>
     2 #define N 100005
     3 #define LL long long
     4 #define inf 0x3f3f3f3f
     5 #define ls tr[x][0]
     6 #define rs tr[x][1]
     7 using namespace std;
     8 inline int ra()
     9 {
    10     int x=0,f=1; char ch=getchar();
    11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    13     return x*f;
    14 }
    15 int main()
    16 {
    17     int n=ra(),k=ra();
    18     int last,lmt=min(n,k),d;
    19     LL tem,ans=0;
    20     if (n>k) ans=(LL)k*(n-k);
    21     for (int i=1; i<=lmt; i=last+1)
    22     {
    23         d=k/i;
    24         last=min(k/d,lmt);
    25         tem=last-i+1;
    26         ans+=tem*(k%i)-(tem*(tem-1)>>1)*d;
    27     }
    28     cout<<ans;
    29     return 0;
    30     
    31 }
  • 相关阅读:
    第07组 Alpha冲刺(1/6)
    第07组 团队Git现场编程实战
    第07组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    0012---求滑动距离
    0011---绝对值函数
    0010---温度转换
    0009---乘法问题
    0008---三位数倒序问题
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6392057.html
Copyright © 2020-2023  润新知