題名
任意の(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;
}