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

来源:互联网 发布:网络出版书籍 编辑:程序博客网 时间:2024/06/07 06:56

这题有毒吧

ei=(e×10w)i10w

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

from decimal import *import mathdef 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 ansgetcontext().prec = 8010e=Decimal(0)i=0fact=Decimal(1)while i<=2700:    e+=fact    i+=1    fact=fact/ipw=1for i in range(8005):    e=e*10    pw=pw*10e=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 mathgetcontext().prec = 1000a=Decimal(1).exp()n=int(input())sum=0sign=1while 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)
原创粉丝点击