2020 Niuke Duo School Game 7 H

題名

トピックリンク

任意の(1、k)が有効な答えです。
(n、k)が有効な回答である場合、(n + k、k)と(n * k、k)は両方とも有効な回答です。
Tグループ、NおよびK(範囲1〜1e12)が与えられた場合、n <= N、k <= Kの範囲で(n、k)の有効数を見つけます。

分析

定数kの場合、nの値の範囲はkの倍数、またはk + 1の倍数のみであり、現在のkに対応する回答の数はO(1)によって計算できます。つまり、1 + n / k + n-1 / kです
。n= 1またはk = 1は特殊であるため、これら2つのケースは回答で別々にカウントできます。

結論として

n = 1またはk = 1の場合の答えはn + k-1である
ため、nが2からN、kが2からK、kが2からKの場合の答えの合計(N / k + N-1 / k) 。
私は数理論部門の知識を使用しました。
チームは数理論に目がくらんでいました。ボードを見たことがありませんでした。3時間書いていませんでした。

テンプレート

コード

#include<bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
long long ans;

void find(long long n,long long k){
    
    
    long long i,j;
    for(i = 2; i <= n && i <= k ; i = j+1){
    
    
        j = min( n / (n/i), k);
        ans = (ans + (j-i+1) * (n/i) ) % mod;
    }
}

int main(){
    
    
	long long n, k;
    scanf("%lld%lld",&n,&k);
    find(n, k);
    find(n-1, k);
    printf("%lld\n",(ans+n+k-1) % mod);
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_35068676/article/details/107774600