洛谷 P1920 成功密码 题解

这是蒟蒻的第一篇题解,(之前的都没过,估计这篇也过不了

回到正题

这题,本蒟蒻第一眼看到以后,就决定咦,这不是模拟吗?

看到世界范围,嗯,打扰了。

扯回正题

首先,暴力肯定是A不了的(至少我A不了

但是,身为蒟蒻的我,还是打了一个暴力。

#include<bits/stdc++.h>
using namespace std; double x, ans; unsigned long long n; double mypow(double x, int y) { double sum = 1; while(y --) sum *= x; return sum; } int main() { scanf("%lf%u", &x, &n); for(int i = 1; i <= n; ++ i) ans += mypow(x, i) / i; printf("%.4lf\n", ans); return 0; }

不出意外,0分,12000ms,全T;

然后,认真分析,这是一道数学题。嗯(废话

用快速幂优化试下

#include<bits/stdc++.h>
using namespace std; double x, ans; unsigned long long n; double ksm(double x, unsigned long long y) { if(y == 1) return x; if(y & 1) return ksm(x * x, y >> 1) * x; return ksm(x * x, y >> 1); } int main() { scanf("%lf%u", &x, &n); for(int i = 1; i <= n; ++ i) ans += ksm(x, i) / i; printf("%.4lf\n", ans); return 0; }

嗯,高一点,30分,8520ms,后面的还是T了,

我们T掉的原因是什么?

就是我们求和那里跑了太多次,而i越的,x的i次方就越小,又因为它的精度要求只有4位,

所以,后面有很多次都是白跑的,对结果没影响。

那就,不跑。

嗯,在输入完n以后,判断一下,是否比maxn大

如果大的话,就赋n为maxn;

好,现在的问题又转化成了,maxn应该取什么值;

maxn应该取一个什么样的值?

它要使得,在它后面的数相加小于0.00005;

额,我最开始随便取了一个值,300

结果,80分,海星;

继续扩大maxn,因为,时间相对还算充裕,我就赋大了一点,赋到了7233,就A了;

好,接下来就是愉快的代码时间了

#include<bits/stdc++.h>
using namespace std; double x, ans; unsigned long long n;//开无符号更保险, //这是递归版的快速幂 double ksm(double x, unsigned long long y) { if(y == (unsigned long long) 1) return x; if(y & 1) return ksm(x * x, y >> 1) * x; return ksm(x * x, y >> 1); } //这是循环版的快速幂 /* double ksm(double x, unsigned long long y) { double ans = 1, base = x; while(y != 0) { if(y & 1 != 0) ans *= base; base *= base; y >>= 1; } return ans; } */ int main() { scanf("%lf%ull", &x, &n);//输入 if(n >= 72333)//奇葩的特判,我觉得这是骗分。。。 n = 72333; for(double i = 1.0; i <= (double) n; ++ i)//嗯,i的类型定义为double更好 ans += ksm(x, i) / i;//递推式,不说; printf("%.4lf\n", ans);//输出 ret

转载于:https://www.cnblogs.com/Flash-plus/p/11203882.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值