让f(i)表示最小的正整数x,使x不是i的除数。
计算∑ni=1f(i)modulo 109+7。换句话说,计算f(1)+f(2)+⋯+f(n) modulo 109+7。
输入
第一行包含一个整数t(1≤t≤104),即测试案例的数量。接着是t个案例。
每个测试案例的唯一一行包含一个整数n(1≤n≤1016)。
输出
对于每个测试案例,输出一个整数ans,其中ans=∑ni=1f(i) modulo 109+7。
例子
inputCopy
6
1
2
3
4
10
10000000000000000
输出拷贝
2
5
7
10
26
366580019
注意
在第四个测试案例中n=4,所以答案=f(1)+f(2)+f(3)+f(4)。
1是1的除数,但2不是,所以2是不属于1的除数的最小正整数,因此,f(1)=2。
1和2是2的除数,但3不是,所以3是不属于2的除数的最小正整数,因此,f(2)=3。
1是3的除数,但2不是,所以2是不是3的除数的最小正整数,因此,f(3)=2。
1和2是4的除数,但3不是,所以3是不是4的除数的最小正整数,因此,f(4)=3。
Therefore, ans=f(1)+f(2)+f(3)+f(4)=2+3+2+3=10.
题解:
f(i) = x,那么对于1 ~ x-1都是可以整除i的
也就是i可以整除
lcm(1,2,3...,x-1)
可以整除到x-1的数目为
n/lcm(1,2,3...,x-1)
可以整除到x的数目为
n/lcm(1,2,3...,x)
根据容斥原理
不可以整除到x的数目为:(既可以整除到x-1,又不能整除的x的数目)
n/lcm(1,2,3...,x-1) - n/lcm(1,2,3...,x)
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
void solve()
{
int n;
cin >> n;
int ans = 0;
int p = 1;
int mod = 1e9 + 7;
for(int i = 2;;i++)
{
int pp = (p*i)/(__gcd(p,i));
ans = (ans + i*(n/p - n/pp + mod)%mod )%mod;
p = pp;
if(p > n)
break;
}
cout << ans << "\n";
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
int t = 1;
cin >> t;
while(t--)
{
solve();
}
}
//