[类欧几里得算法] Codechef JUNE17 #ES Euler Sum

这题有毒吧

ei=(e×10w)i10w

然后只要 e 的精度足够高 就可以当做整数类欧求 这里w 8000 4000 是不够的,纠结了好久,阿爷说会小数点后有进位进到个位

from decimal import *
import math

def calc(a,b,n):
    ans=0
    flag=1
    while a!=0 and b!=0:
        #print(a,b)
        sum=(a//b)*n*(n+1)//2
        a%=b
        if a==0 or b==0:
            if flag==1:
                ans+=sum
            else:
                ans-=sum
            break
        else:
            t=a*n//b
            if flag==1:
                ans+=sum+n*t+n//b
            else:
                ans-=sum+n*t+n//b
            n=t
            t=b;b=a;a=t
        flag=-flag
    return ans


getcontext().prec = 8010
e=Decimal(0)
i=0
fact=Decimal(1)
while i<=2700:
    e+=fact
    i+=1
    fact=fact/i
pw=1
for i in range(8005):
    e=e*10
    pw=pw*10
e=int(e)
#print(e)
n=int(input())
#n=1;
#for i in range(2000):
#    n=n*10
#print(calc(e,pw,n)%10000000000)
print(calc(e,pw,n))

本来还有个在这里看来的实数类欧做法 现在这个问题因为违规被锁了 不过实数太慢了 T了 只有50

from decimal import *
import math
getcontext().prec = 1000
a=Decimal(1).exp()
n=int(input())
sum=0
sign=1
while n>0:
    #print(n,a)
    if a>2 :
        m=int(math.floor(a-1))
        sum=sum+sign*m*n*(n+1)//2
        a=a-m
    else:
        n=int(math.floor(a*n))
        sum=sum+sign*n*(n+1)//2
        sign=-sign
        a=a/(a-1)
        n=int(math.floor((n+1)/a))
print(sum)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值