AtCoder Beginner Contest 162 過去問
悲報
ワイ、163を解いていたつもりが162を解いており無事死亡
— アオイ (@cyberdive00) 2020年4月19日
ここ最近勉強をサボっていたツケですね・・・
これからは毎日AtCoderの問題解きますので、
AtCoderの神様・・・どうか私を見捨てないで・・・
A問題
これは楽勝。
n = input() if '7' in n: print('Yes') else: print('No')
B問題
FizzBuzz問題を若干いじったものでした。
n = int(input())+1 i,sum = 1,0 while i<n: if i%3!=0 and i%5!=0: sum+=i i+=1 print(sum)
C問題
itertoolsを使って、順列&重複
hibiki-press.tech
イテレータを生成しました。
これに最大公約数を求めます。
import numpy as np import math import itertools nums = np.arange(1,int(input())+1) pp = list(itertools.product(nums, repeat=3)) sum = 0 for p in pp: k=math.gcd(p[0],p[1]) sum+=math.gcd(k,p[2]) print(sum)
しかしTLE。
- 3つ異なる数字で構成(A)
- 2つの数字で構成(B)
- 全て1つの数字で構成(C)
に分類し、計算量の無駄を省きます。
Cでは1~Nまでの合計を足すだけなので、
わざわざ最大公約数を求める必要はありません。
Bでも(1,1,2)(2,1,1)(1,2,1)(2,1,2)(1,2,2),(2,2,1)を(1,2)で表現して、
あとで6倍すれば同義です。
import math import itertools n = range(1,int(input())+1) ppp = list(itertools.combinations(n, 3)) pp = list(itertools.combinations(n, 2)) asum,bsum,csum = 0,0,0 for p in ppp: asum+=math.gcd(math.gcd(p[0],p[1]),p[2]) for p in pp: bsum+=math.gcd(p[0],p[1]) for p in n: csum+=p print(asum*6+bsum*6+csum)