数论-质数-轻拍牛头(BZOJ1607)

本文探讨了在处理大量整数运算时,如何通过优化筛法算法来减少重复计算,从而将时间复杂度从O(nloga)降低到更优。通过对相同数值的合并处理,实现了算法效率的显著提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一眼看过去很简单,十几行写完了。时间复杂度O(nloga),a为最大的值。

#include<bits/stdc++.h>
#define rep(i,l,r) for(register int i=(l);i<=(r);i++)
using namespace std;
const int inf=1e9+10,N=1e6+100;
int n,a[N],cnt[N],lim;
int main(){
//	freopen("input.in","r",stdin); freopen("output.out","w",stdout);
	cin>>n;
	rep(i,1,n) cin>>a[i],lim=max(lim,a[i]);
	rep(i,1,n) for(register int j=a[i];j<=lim;j+=a[i]) cnt[j]++;
	rep(i,1,n) cout<<cnt[a[i]]-1<<endl;
	return 0;
}

结果交上去T了两个点,思考许久才发现这些数并不一定相同,只有当这些数各不相同的时候复杂度才是O(nloga),于是将所有相同的数合并在一起算,复杂度下降到小于O(nloga)。

//因为这n个数并不是全都不同的,直接筛复杂度并非O(nloga),会T
//所以将相同的数一起去筛其他的数,复杂度降低到小于O(nloga)。 
#include<bits/stdc++.h>
#define rep(i,l,r) for(register int i=(l);i<=(r);i++)
using namespace std;
const int inf=1e9+10,N=1e6+100;
int n,cnt[N],ans[N],lim,a[N];
int main(){
	//freopen("input.in","r",stdin); freopen("output.out","w",stdout);
	cin>>n;
	rep(i,1,n) cin>>a[i],cnt[a[i]]++,lim=max(lim,a[i]);
	rep(i,1,lim) if(cnt[i]) for(register int j=i;j<=lim;j+=i) ans[j]+=cnt[i];
	rep(i,1,n) cout<<ans[a[i]]-1<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值