[NOIP 2023 模拟7]难题
[NOIP 2023 模拟7] 难题
题意:
定义:f(i)为非i因子的最小正整数。
现给出 t 组 正整数 n。
对每组 n ,求 ∑(i=1~n) f(i) %= 1e9+7
思路:
暴力做法:将t个数字从小到大排序,求出1~n_t所有数的f()。每个n的答案即为 ∑(i=1~n) f(i) %= 1e9+7
评价:时间复杂度爆炸
考虑优化:
我们把“枚举因数将1~n中的数层层过筛”的过程模拟,代码如下:
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL mod=1e9+7;
const int N=1e4+10;
int t;
LL lcm(LL x,LL y) { return x*y/__gcd(x,y); }
int main() {
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>t;
LL n;
for(int i=1;i<=t;i++) {
cin>>n;
LL nn=n,ans=0;
LL sta=1,j=1,tmplcm,num;
while(nn) {
do {
j++;
tmplcm=lcm(sta,j);
}while(sta==tmplcm);
sta=tmplcm;
num=nn-n/sta;
ans+=j*num;
nn-=num;
if(ans>=mod) ans%=mod;
}
cout<<ans<<'\n';
}
return 0;
}