zoukankan      html  css  js  c++  java
  • UVA1363

    题意:给出n和k,1≤n,k≤1e9,计算

    切入点是k/i 和 k/(i+1)差距不大。令pi = k/i, ri = k%i。如果pi+1 == pi,那么ri+1 == k - pi(i+1) == ri - pi

    对于pi+z == pi,ri+z == ri - z*pi,这是等差数列可以O(1)计算出来。如果上界为j,那么k/j ≤ pi,j ≤ k/pi。

    /*********************************************************
    *      --------------Tyrannosaurus---------              *
    *   author AbyssalFish                                   *
    **********************************************************/
    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    
    
    ll solve(int n, int k)
    {
        ll ans = 0;
        for(int i = 1; i <= n; ){
            int p = k/i;
            if(!p){
                ans += (n+1-i)*(ll)k;
                break;
            }
            int j = min(k/p, n), r = k-i*p;
            ans += (2LL*r - (j-i)*p)*(j-i+1LL)/2LL;
            i = j+1;
        }
        return ans;
    }
    
    //#define LOCAL
    int main()
    {
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif
        int n, k;
        while(~scanf("%d%d",&n,&k)){
            printf("%lld
    ", solve(n,k));
        }
        return 0;
    }
  • 相关阅读:
    常用正则表达式大全
    ASP.netMVC验证码
    装饰器
    闭包函数
    猜年龄
    函数基础
    文件的高级应用
    字符编码
    文件的三种打开模式
    深浅拷贝+异常处理
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4963303.html
Copyright © 2011-2022 走看看