[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;
}
posted on 2024-11-04 20:10  Ueesugi_sakura  阅读(2)  评论(0编辑  收藏  举报