輸入1個數N(2 <= N <= 10^12)。
輸出F(n) Mod 1000000007的結果。
6
3
思路:取餘之後的數字是有規律的,比如說n=20的時候:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 200 0 2 0 0 2 6 4 2 0
9 8 7 6 5 4 3 2 1 0
每一個下劃線上的幾個餘數都是一個等差數列(可以O(1)求出),
由下劃線的第一個數字就可以求出最後一個數字,比如說7到10這一段,20/7=20/10,所以這些是一段,20/11=20/20
所以11到20是一段。假如說第一個數字是i,那麼這段的最後一個就是20/(20/i),個數是20/(20/i)-i+1;
然後等差數列公式求出即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<string>
#include<algorithm>
#define inf 0x3f3f3f3f
#define LL long long
const LL mod=1e9+7;
using namespace std;
LL n;
LL F(LL &i)//i用引用
{
LL j=i;//開頭
i=n/(n/i);//末尾
LL sum=(i-j+1)%mod;//個數
return (n%i+n%j)%mod*sum%mod*(500000004LL)%mod;//除2應該變成*500000004LL
}
int main()
{
scanf("%I64d",&n);
LL sum=0;
for(LL i=2;i<=n;i++)
{
sum+=F(i);
sum%=mod;
}
printf("%I64d\n",sum);
}