#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 出锅了?放上代码,目测 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 都会被关注哦∼
(本蒟蒻想破头也想不出 O(n) 或者 O(logn) 等一切能卡过Subtask#3的算法,有大佬能详细解释一下么?