結果
問題 | No.8079 アルベド |
ユーザー |
![]() |
提出日時 | 2022-09-06 16:55:45 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 251 ms / 2,000 ms |
コード長 | 4,103 bytes |
コンパイル時間 | 264 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 17,280 KB |
最終ジャッジ日時 | 2024-11-21 18:01:25 |
合計ジャッジ時間 | 3,116 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 |
ソースコード
import sysreadline=sys.stdin.readlinewrite=sys.stdout.writeclass Prime:def __init__(self,N):assert N<=10**8self.smallest_prime_factor=[None]*(N+1)for i in range(2,N+1,2):self.smallest_prime_factor[i]=2n=int(N**.5)+1for p in range(3,n,2):if self.smallest_prime_factor[p]==None:self.smallest_prime_factor[p]=pfor i in range(p**2,N+1,2*p):if self.smallest_prime_factor[i]==None:self.smallest_prime_factor[i]=pfor p in range(n,N+1):if self.smallest_prime_factor[p]==None:self.smallest_prime_factor[p]=pself.primes=[p for p in range(N+1) if p==self.smallest_prime_factor[p]]def Factorize(self,N):assert N>=1factors=defaultdict(int)if N<=len(self.smallest_prime_factor)-1:while N!=1:factors[self.smallest_prime_factor[N]]+=1N//=self.smallest_prime_factor[N]else:for p in self.primes:while N%p==0:N//=pfactors[p]+=1if N<p*p:if N!=1:factors[N]+=1breakif N<=len(self.smallest_prime_factor)-1:while N!=1:factors[self.smallest_prime_factor[N]]+=1N//=self.smallest_prime_factor[N]breakelse:if N!=1:factors[N]+=1return factorsdef Divisors(self,N):assert N>0divisors=[1]for p,e in self.Factorize(N).items():pow_p=[1]for _ in range(e):pow_p.append(pow_p[-1]*p)divisors=[i*j for i in divisors for j in pow_p]return divisorsdef Is_Prime(self,N):return N==self.smallest_prime_factor[N]def Totient(self,N):for p in self.Factorize(N).keys():N*=p-1N//=preturn Ndef Mebius(self,N):fact=self.Factorize(N)for e in fact.values():if e>=2:return 0else:if len(fact)%2==0:return 1else:return -1class Cumsum:def __init__(self,lst,mod=0):self.N=len(lst)self.mod=modself.cumsum=[0]*(self.N+1)self.cumsum[0]=0for i in range(1,self.N+1):self.cumsum[i]=self.cumsum[i-1]+lst[i-1]if self.mod:self.cumsum[i]%=self.moddef __getitem__(self,i):if type(i)==int:if 0<=i<self.N:a,b=i,i+1elif -self.N<=i<0:a,b=i+self.N,i+self.N+1else:raise IndexError('list index out of range')else:a,b=i.start,i.stopif a==None or a<-self.N:a=0elif self.N<=a:a=self.Nelif a<0:a+=self.Nif b==None or self.N<=b:b=self.Nelif b<-self.N:b=0elif b<0:b+=self.Ns=self.cumsum[b]-self.cumsum[a]if self.mod:s%=self.modreturn sdef __setitem__(self,i,x):if -self.N<=i<0:i+=self.Nelif not 0<=i<self.N:raise IndexError('list index out of range')self.cumsum[i+1]=self.cumsum[i]+xif self.mod:self.cumsum[i+1]%=self.moddef __str__(self):lst=[self.cumsum[i+1]-self.cumsum[i] for i in range(self.N)]if self.mod:for i in range(self.N):lst[i]%=self.modreturn "["+", ".join(map(str,lst))+"]"M=10**5P=Prime(M)cnt=[0]*(M+1)for i in range(1,M+1):if P.Is_Prime(i):cnt[i]=1cnt=Cumsum(cnt)T=int(readline())for t in range(T):N=int(readline())ans=cnt[:N+1]print(ans)