蒟蒻求助......时间复杂度O(n)应该可以过Subtask#2
查看原帖
蒟蒻求助......时间复杂度O(n)应该可以过Subtask#2
332022
ChthollyMeow楼主2020/5/31 22:07
  • 赛时打了个 O(n2logn)O\left(n^2 \log n\right) 的暴力还没有当初的小Z牛,wtcl
  • 赛后苦思冥想,终于想到了 O(n)O(n) 算法
  • 理论上来说, O(n)O(n) 应该可以卡过Subtask#2 吧
  • 然鹅为啥我Subtask#2全WA呢?
  • Subtask#1都过了,应该不是代码逻辑错误(?)
  • 代码如下:
#include<bits/stdc++.h>
using namespace std;
int x,ans=0;
int a[]={1,2,4,5,8,10,16,20,25,32,40,50,64,80,100,125,128,160,200,250,256,320,400,500,512,625,640,800,1000,1024,1250,1280,1600,2000,2500,2560,3125,3200,4000,5000,5120,6250,6400,8000,10000,12500,12800,15625,16000,20000,25000,25600,31250,32000,40000,50000,62500,64000,78125,80000,100000,125000,128000,156250,160000,200000,250000,312500,320000,400000,500000,625000,640000,800000,1000000,1250000,1600000,2000000,2500000,3200000,4000000,5000000,8000000,10000000,16000000,20000000,40000000,80000000};
//打表预处理所有只含2,5两个因子的数
inline char nc(){
	static char buf[100000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int _read(){
	char ch=nc();
	int sum=0;
	while(!(ch>='0'&&ch<='9')){
		ch=nc();
	}
	while(ch>='0'&&ch<='9'){
		sum=(sum<<3)+(sum<<1)+ch-48;
		ch=nc();
	}
	return sum;
}
inline void out(register int a){
	if(a>=10)out(a/10);
	putchar(a%10+'0');
}
//快速快输
int main(){
	x=_read();
	for(int i=0;a[i]<=x;i++){
		for(int j=1;j<=(int)x/a[i];j++){
			if(j%2==0||j%5==0)continue;
			ans+=(int)x/j;
		}
	}
	out(ans);
	return 0;
}

难道是打表的 generator\text{generator} 出锅了?放上代码,目测 generator\text{generator} 没问题......

#include<bits/stdc++.h>
using namespace std;
long long a[10005],cnt=0;
int main(){
	for(long long i=1;i<=1024/*1024=2^10*/;i*=2){
		for(long long j=1;j<=78125/*78125=5^7*/;j*=5){
			a[cnt++]=i*j;
		}
	}
	sort(a,a+cnt);
	printf("int a[]={");
	for(int i=0;i<cnt-1;i++){
		printf("%d,",a[i]);
	}
	printf("%d};",a[cnt-1]);
	return 0;
}

据说,帮助本蒟蒻调代码的 dalao\text{d\color{red}alao} 都会被关注哦\sim

(本蒟蒻想破头也想不出 O(n)O(\sqrt{n}) 或者 O(logn)O(\log n) 等一切能卡过Subtask#3的算法,有大佬能详细解释一下么?

2020/5/31 22:07
加载中...