• 2020 Nowcoder Training


    The following rules define a kind of integer tuple - the Legend Tuple:
    (1; k) is always a Legend Tuple, where k is an integer.
    if (n; k) is a Legend Tuple, (n + k; k) is also a Legend Tuple.
    if (n; k) is a Legend Tuple, (nk; k) is also a Legend Tuple.
    We want to know the number of the Legend Tuples (n; k) where 1 n N; 1 k K.
    In order to avoid calculations of huge integers, report the answer modulo 109 + 7 instead.
    Input
    The input contains two integers N and K, 1 N; K 1012.
    Output
    Output the answer modulo 109 + 7.

    很容易想到枚举每个k计算贡献。

    当时画的草稿:

     发现对于每个k。1总是算的,然后就是k,k+1。然后以此为周期。

    因此对于一个n,我可以算单个k的贡献就是 1 + (n - 1) / k 。当然还要加上余数的部分。

    因此总的贡献就是

     当然实现还有很多细节,由于整除分块写的不多,很多细节要注意。比如取min,比如溢出,比如先乘还是先除。

    int readint() {
        int x = 0, f = 1; char ch = getchar();
        while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    
    ll readll() {
        ll x = 0, f = 1; char ch = getchar();
        while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    
    void Put(ll x) {
        if (x > 9) Put(x / 10);
        putchar(x % 10 + '0');
    }
    
    int main() {
        ll n, k;
        n = readll(), k = readll();
        if (k == 1ll) {
            Put(n % MOD);
            return 0;
        }
        if (n == 1ll) {
            Put(k % MOD);
            return 0;
        }
        ll res = 0;
        for (ll l = 2, r; l <= k && l <= n - 1; l = r + 1) {
            assert(l <= n - 1);
            if (k / l != 0) r = min((n - 1) / ((n - 1) / l), k), r = min(r, n - 1);
            else r = k;
            res = (res + (n - 1) / l * (r - l + 1) % MOD) % MOD;
        }
        res = res * 2 % MOD;
        res = (res + (k % MOD) - 1 + MOD) % MOD;
        for (ll i = 1; i * i <= n; i++) {
            if (n % i) continue;
            if (i <= k) res = (res + 1) % MOD;
            if (n / i <= k && i * i != n) res = (res + 1) % MOD;
        }
        res = (res - 1 + MOD) % MOD;
        res = (res + n) % MOD; 
        Put(res);
    }
  • 相关阅读:
    仿pinterest实现瀑布流布局效果
    .NET执行cmd时,如何调试命令的执行效果
    在Sharepoint 2007 整合Discuz Nt论坛
    如何使用EWS获取邮件及其附件
    启明星win7桌面天气预报软件下载与使用方法(带时间)
    【helpdesk】启明星helpdesk7.0版本里,实现邮件提交功能介绍和原理
    微软.NET设计上的一个错误(从.NET1.14.0),不知道以后.NET会不会修复这个错误
    什么是Traceback Ping
    用ASP生成RSS以及讀取RSS
    [轉]訂單編號方式探討
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13416026.html
Copyright © 2020-2023  润新知