Files
OI-source/lib.py
2023-08-03 09:22:52 +08:00

208 lines
5.0 KiB
Python

from sys import *
# IO
def isprint(ch):
isp=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9',
'~','`','!','@','#','$','%','^','&','*','(',')',
'-','_','=','+','[','{',']','}','\\','|',
';',':','\'','"',
',','<','.','>','/','?']
return ch in isp
class Input:
io_line_buf=""
io_line_buf_size=0
io_line_buf_cnt=0
file=stdin
eof=False
def __init__(self,f=stdin):
self.io_line_buf=""
self.io_line_buf_size=0
self.io_line_buf_cnt=0
self.file=f
self.eof=False
def freopen(self,name):
self.io_line_buf=""
self.io_line_buf_size=0
self.io_line_buf_cnt=0
self.file=open(name)
self.eof=False
def alloc(self):
if self.io_line_buf_cnt>=self.io_line_buf_size:
self.io_line_buf=self.file.readline()
self.io_line_buf_size=len(self.io_line_buf)
self.io_line_buf_cnt=0
if self.io_line_buf_size == 0 :
self.eof=True
def getchar(self):
self.alloc()
if self.eof:
return '\0'
self.io_line_buf_cnt=self.io_line_buf_cnt+1
return self.io_line_buf[self.io_line_buf_cnt-1]
def getline(self):
self.alloc()
if self.eof:
return ''
if self.io_line_buf[-1:]=='\n':
res=self.io_line_buf[self.io_line_buf_cnt:-1]
else:
res=self.io_line_buf[self.io_line_buf_cnt:]
self.io_line_buf_cnt=len(self.io_line_buf)
return res
def read_int(self):
vali=['-','0','1','2','3','4','5','6','7','8','9']
S=""
ch=""
while not self.eof:
ch=self.getchar()
if ch in vali :
break
S=ch
while not self.eof:
ch=self.getchar()
if not ( ch in vali ) :
break
S=S+ch
return int(S)
def read_float(self):
vali=['.','-','0','1','2','3','4','5','6','7','8','9']
S=""
ch=""
while not self.eof:
ch=self.getchar()
if ch in vali :
break
S=ch
while not self.eof:
ch=self.getchar()
if not ( ch in vali ) :
break
S=S+ch
return int(S)
def read_str(self):
S=""
ch=""
while not self.eof:
ch=self.getchar()
if isprint(ch):
break;
S=ch
while not self.eof:
ch=self.getchar()
if not isprint(ch):
break;
S=S+ch
return S
def read_char(self):
ch=""
while not self.eof:
ch=self.getchar()
if isprint(ch):
break
return ch
def scanf(self,flist):
out=[]
for tp in flist:
if tp == 'D' or tp == 'd' :
out.append(self.read_int())
elif tp == 'F' or tp == 'f' :
out.append(self.read_float())
elif tp == 'C' or tp == 'c' :
out.append(self.read_char())
else:
out.append(self.read_str())
if len(out) == 1:
return out[0]
else:
return out
IO_inf=Input()
def scanf(flist):
return IO_inf.scanf(flist)
def getchar():
return IO_inf.getchar()
def getline():
return IO_inf.getline()
# math
def gcd(a,b):
if b==0 :
return a
return gcd(b,a%b)
def lcm(a,b):
return int(a/gcd(a,b)*b)
def yf(a,b):
c=gcd(a,b)
a=a/c
b=b/c
return [a,b]
#自适应辛普森积分
'''c++版
#include<cstdio>
#include<cmath>
double a;
inline double f(double x) { return pow(x,a/x-x); }
inline double simpson(double a,double b) { return (f(a)+4*f((a+b)/2)+f(b))*(b-a)/6; }
double asr(double a,double b,double eps,double A)
{
double c=(a+b)/2;
double L=simpson(a,c),R=simpson(c,b);
if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15;
return asr(a,c,eps/2,L)+asr(c,b,eps/2,R);
}
double asr(double a,double b,double eps) { return asr(a,b,eps,simpson(a,b)); }
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%lf",&a);
const double eps=1e-8;
if(a<0) printf("orz\n");
else printf("%.5lf\n",asr(eps,20,eps));
return 0;
}
'''
def simpson(f,a,b):
return (f(a)+4*f((a+b)/2.0)+f(b))*(b-a)/6.0
def asr(f,a,b,eps,A):
c=(a+b)/2.0
L=simpson(f,a,c)
R=simpson(f,c,b)
if abs(L+R-A)<=15*eps:
return L+R+(L+R-A)/15.0
return asr(f,a,c,eps/2.0,L)+asr(f,c,b,eps/2.0,R)
def sps(f,a,b,eps):
return asr(f,a,b,eps,simpson(f,a,b))
# Data Struct
def Array(*idx,dft=0):
ary=[]
idx=list(idx)
idx.reverse()
for i in range(0,idx[0]):
ary.append(dft)
for rg in idx[1:]:
x=[]
for j in range(0,rg):
x.append(ary[:])
ary=x
return ary