社区讨论

O(logn)算法

P2388阶乘之乘参与者 9已保存回复 16

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
16 条
当前快照
1 份
快照标识符
@mi7xumvi
此快照首次捕获于
2025/11/21 05:23
4 个月前
此快照最后确认于
2025/11/21 06:40
4 个月前
查看原帖
花了我44小时44张草稿纸,终于想出了一个O(logn)O(logn)的算法,我应该是第一个用这个玄学算法的吧
emmmemmm
开心
CPP
#include<cstdio>
long long ans;

const int p = 5;
const int sp=(p*(p-1))>>1;
int main() {
    int n;
    scanf("%d",&n);
    int s=n,l=0,base1=p,base=1;
    while(s/=5) l++;
    for(register int cur=1;cur<=l;cur++) {
        int base2=base1*p,x=(n+1)/base2;
        long long a=sp*x*base1;
        int y=n%base2-base1+1;
        for(register int i=1;i<p&&y>0;i++,y-=base1) {
            if(y>base1) a+=base1*i;
            else { a+=y*i; break; }
        }
        base1=base2;
        ans+=a*base; base=p*base+1;
    }
    printf("%lld\n",ans);
    return 0;
}

回复

16 条回复,欢迎继续交流。

正在加载回复...