1 条题解

  • 0
    @ 2025-8-24 22:57:38

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Brain_Huger
    florr zorr 玩家 | 不活跃 | P+O2=POO

    搬运于2025-08-24 22:57:38,当前版本为作者最后更新于2024-05-05 11:57:43,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    写一篇不用二分的题解。

    思路

    首先我们发现,题目中可以这么修改:

    pow f,将计数器 xx 变为 xfx^fff 可以为浮点数

    我们可以观察下幂函数 y=2xy=2^x 的图像:

    x0x \ge 0 时,值域为 [1,)[1,\infty)。也就是说,我们可以直接执行一次 pow 操作,使其变成任何大于等于 11 的数。接着发现 i=1nai1010\sum_{i=1}^n a_i\le10^{10}。我们可以直接花 nn 次操作把 xx 变为 i=1nai\sum_{i=1}^n a_i

    接着就是这个式子:

    xp=cp=logxcx^p=c\\p=\log_xc

    根据换底公式用 c++ 自带的 log\log 函数即可,操作次数 n+1n+1

    注意 cc 可能为 00,当 c=0c=0 时方法就不多说了,操作次数 nn

    代码

    #include<bits/stdc++.h>
    #define int long long
    int n,x,y,X;
    signed main(){
    	scanf("%lld%lld%lld",&n,&x,&y),x=0;
    	if(y==0){
    	    printf("%lld\n",n);
    	    for(int i=1;i<=n;i++)scanf("%lld",&X),printf("mul %lld\n",i);
    	    return 0;
    	}
    	printf("%lld\n",n+1);
    	for(int i=1;i<=n;i++)scanf("%lld",&X),x+=X,printf("add %lld\n",i);
    	long double ans=log10(y)*1.0000/log10(x),s=pow(x,ans);//此处用 log,log2都行
    	if(fabs(s-y)>1e-4)while(printf("sto wmr orz"));
    	printf("pow %.114510Lf",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    9975
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者