专栏文章

题解:UVA10523 Very Easy !!!

UVA10523题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mioy6igf
此快照首次捕获于
2025/12/03 03:04
3 个月前
此快照最后确认于
2025/12/03 03:04
3 个月前
查看原文
非常简单的题目,直接模拟就可以了。
考虑小优化之后,抛开高精度之后复杂度是 O(n)O(n) 的,完全没有问题。
高精度并不是什么很有技术的事情,所以直接给出 Python 代码,也更加方便理解。
PY
import sys
seq=sys.stdin.readlines()
for _ in seq:
    n,a=map(int,_.split(' '))
    ans=0
    k=1
    for __ in range(n):
        k*=a
        ans+=(__+1)*k
    print(ans)
但是实际上这里可以直接使用公式。
我们记要求的和式 i=1niai=S\displaystyle\sum_{i=1}^ni\cdot a^i=S。 则
aS=i=1niai+1SaS=(i=1nai)nan+1S=(i=1nai)nan+11aaS=\sum_{i=1}^ni\cdot a^{i+1} \newline S-aS=\left(\sum_{i=1}^{n}a_i\right)-na^{n+1} \newline S=\displaystyle\frac{\displaystyle\left(\sum_{i=1}^{n}a_i\right)-na^{n+1}}{1-a}
而且这里是没有任何取模运算的,所以可以直接用等比数列的求和公式算,就像这样:
PY
import sys

def main():
    data = sys.stdin.read().split()
    if not data:
        return
    
    idx = 0
    results = []
    while idx < len(data):
        n = int(data[idx])
        a = int(data[idx+1])
        idx += 2
        if a == 1:
            ans = n * (n + 1) // 2
        else:
            an = pow(a, n)
            an1 = an * a a^{n+1}
            numerator = a * (1 - (n + 1) * an + n * an1)
            denominator = (1 - a) * (1 - a)
            ans = numerator // denominator
        results.append(str(ans))
    
    print("\n".join(results))

if __name__ == "__main__":
    main()
这个就跑的飞快了,比常规的 C++ 高精度版本还快的多。
如果还要更快,就只能祭出我 C++ 了。

评论

0 条评论,欢迎与作者交流。

正在加载评论...