上のバー、ハイパー邪魔。
消し方
- リモートデスクトップの接続画面
- オプションの表示
- 「画面」メニュー
- 「全画面表示の使用時に接続バーを表示する」のチェックを外す
切断方法
- スタートボタンを右クリック
- 「シャットダウンまたはサインアウト」
- 「切断」を選択
上のバー、ハイパー邪魔。
何がやりたいかと端的に言うと、
のようにしたい。
小数点といえばDecimalなので、Decimalモジュールを探したらそれっぽいDecimal.normalizeがありました。
数値を正規化 (normalize) して、右端に連続しているゼロを除去し、 Decimal('0') と同じ結果はすべて Decimal('0e0') に変換します。等価クラスの属性から基準表現を生成する際に用います。たとえば、 Decimal('32.100') と Decimal('0.321000e+2') の正規化は、いずれも同じ値 Decimal('32.1') になります。
これは良さそう。早速使ってみます。
from decimal import Decimal s = "30.0" a = Decimal.normalize(Decimal(s)) print(a) # 3E+1
うーん。指数表現になってしまった。
他に使えそうなものを探すと、Context.normalizeがありました。こっちを使ってみましょう。
from decimal import Decimal, Context s = "30.0" context = Context() a = context.normalize(Decimal(s)) print(a) #3E+1
変わらないですね。指数表現じゃなくしてほしいんですが。
色々漁ってると、Decimal FAQにドンピシャなQAがありました。
Q. ある種の十進数値はいつも指数表記で表示されます。指数表記以外の表示にする方法はありますか?
A. 値によっては、指数表記だけが有効桁数を表せる表記法なのです。たとえば、 5.0E+3 を 5000 と表してしまうと、値は変わりませんが元々の2桁という有効数字が反映されません。
もしアプリケーションが有効数字の追跡を等閑視するならば、指数部や末尾のゼロを取り除き、有効数字を忘れ、しかし値を変えずにおくことは容易です:
>>> def remove_exponent(d): ... return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize() >>> remove_exponent(Decimal('5E+3')) Decimal('5000')
なるほど。
というわけで、数値(float or int)から正規化した文字列(str)を返す関数は以下のようになります。
from decimal import Decimal, Context def decimal_normalize(f): """数値fの小数点以下を正規化し、文字列で返す""" def _remove_exponent(d): return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize() a = Decimal.normalize(Decimal(str(f))) b = _remove_exponent(a) return str(b) print(decimal_normalize(30.0)) # 30 print(decimal_normalize(30)) # 30 print(decimal_normalize(30.0001000)) # 30.0001 print(decimal_normalize(0.0)) # 0 print(decimal_normalize(0)) # 0 print(decimal_normalize(-5.0)) # -5
Decimal(x)するときに、xはstr型にする必要はなくてfloat型のままでもいけますが、私はstr型に変換するようにしています。なんか挙動の差があって、str型に変換したほうが安定していたイメージがあるので(うろおぼえ)。
Decimalモジュールを探す前に書いていたコード。Decimalを使いたくないときはこっちでもまあ。
def decimal_normalize(f): text = str(f) while True: if ("." in text and text[-1] == "0") or (text[-1] == "."): text = text[:-1] continue break return text print(decimal_normalize(30.0)) # 30 print(decimal_normalize(30)) # 30 print(decimal_normalize(30.0001000)) # 30.0001 print(decimal_normalize(0.0)) # 0 print(decimal_normalize(0)) # 0 print(decimal_normalize(-5.0)) # -5
問題:AtCoder Beginner Contest 143: D - Triangles
公式解説PDF:https://img.atcoder.jp/abc143/editorial.pdf
公式解説動画:https://youtu.be/3U_N7zelnMM?t=2983
解説動画まんまです。
二分探索問題です。
問題の条件の、
というのは三角形の成立条件ですね。
3つの棒を選んで、それでいくつ三角形を作れるかという問題ですが、便宜上、選んだ3辺のうち最も長い辺をcとします。
単純な方法で求めるならば全探索で、a,b,cそれぞれでループ(3重ループ)回せばよいですが、それだとでTLEします。
しょうがないので、aとbを固定して考えてみます(aとbについてforループで回します)。
与えられた棒が 2 3 4 6 6 7 10
とします。これをリストに入れて予めソートしておきます。
今、a=3, b=6 とすると、
2 | 3 | 4 | 6 | 6 | 7 | 10 |
---|---|---|---|---|---|---|
a | b |
a + b = 9なので、a + b > c
より、cは9未満になります。
2 | 3 | 4 | 6 | 6 | 7 | 10 |
---|---|---|---|---|---|---|
a | b | ○ | ○ |
上記の○の数を数えていけば、答えは求まります。
ここで問題となるのが、上でいう「7以下」という境界をどう高速に求めればよいのかということですが、これは二分探索で高速に求まります。
# -*- coding:utf-8 -*- import bisect def solve(): N = int(input()) Ls = list(map(int, input().split())) Ls.sort() # O(N^2 * logN)の全探索で解く ans = 0 for a_i in range(N): for b_i in range(a_i+1, N): c_i = bisect.bisect_left(Ls, Ls[a_i]+Ls[b_i]) if c_i > b_i: ans += c_i - b_i - 1 else: pass print(ans) if __name__ == "__main__": solve()
計算量はです 。
2019/09/08(日)、HHKBのキーボードを買いました。
そんなわけでHHKB Pro JP を買ったのであった pic.twitter.com/LauMfvAySF
— takeg@8883 (@takeg2017) September 8, 2019
買ったのはHHKB Professional JPの墨(PD-KB420B)です。
などです。
キーボードは基本Bluetoothのものしか買わないのですが、以下の理由でBT版は見送りました。
USB接続はやっぱ面倒くさいですが、会社の広めできれいな机ならばまぁ許容できます。
ただHHKBのUSB接続の非常に良い点として、USB接続のHHKB本体側はmini USB Bタイプになっているので、本体とケーブルを完全に取り外しが可能です。ちょっと横に置くときとかに便利ですし、ケーブルが断線した場合はケーブルのみ買い換えればOKです。
現在(2019/09/08)の最新モデルはHHKB Professional Type-Sと呼ばれるもので、こちらはSpeed(早打ち)とSilent(静音性)の性能が高くなってるとのこと。基本的に最新のものを欲しいと思う性分なので本当はこっちが欲しかったけど以下の理由で見送りました。
キーボードの右下がHHKBと刻印されてるやつがカッコいいのですが、それは英語配列版なのです。英語配列は以下の理由で見送りました。
通常のキーボードとHHKB JP(日本語配列)はキー配置が違います(英語配列はまた違う)。詳しくはこちら。
一番下の段のキーのマークと配置が独特なので、それらについて少し解説します。
みたいに、配置はともかく謎マークのキーが存在します。この謎マークは背面のDIPスイッチでPC(Windows)モードやMacモードを切り替えたときにマークの意味に矛盾を生じさせないためでしょう。それが逆にわかりにくくなってる感はありますが。
カラーキートップを購入し、少しカスタマイズしました。
今はその3で運用しています。
NEW GAME! 涼風青葉のねんどろいどを買いました。購入した理由は以下の理由です。
しかし以下の理由で、まだ会社に持っていけていません。
シット!なんてこったブッダ!俺は涼風青葉と一緒に仕事をしたいっていうのに、他人の目を気にして行動できないままでいやがる。お前はいつもそうだ。何をするにも中途半端で、誰もお前を愛さない。
問題:AtCoder Beginner Contest 112: D - Partition
公式解説PDF:https://img.atcoder.jp/abc112/editorial.pdf
公式解説動画:AtCoder Beginner Contest 112 解説放送 - YouTube
解説動画まんまです。
のとき、最大公約数の最大値は?という問題です。
ここでとおくと、
はそれぞれKの倍数なので、MもKの倍数です。
MがKの倍数ということは、KはMの約数ということです。
KはMの約数ということは、 と書けます。
たとえば、N=10, M=168のときの、約数Kの最大値を求めたいとします。
Mの約数は1, 2, 3, 4, 6, 7, 8, 12, 14, 21, 24, 28, 42, 56, 84, 168
です。
となるのでOKです。
となるのでOKです。
となるのでOKです。
となるのでOKです。
となるのでOKです。
で、9KはM=168の値を超えてしまうのでだめです。
K=24以降も、同様に9KがMを超えてしまうのでだめです。
以上の考察から、Mの約数Kのうち、 を満たす最大のKを探索すれば良いです。
制約より、Mのとりうる最大値はと大きいですが、としたときの約数のペア(A, B)は高々を境に対称なので、探索は以下までで十分です。
対称というのはたとえば、M=100のとき、約数のペア(A, B)は、
となるので、約数のペアを探すのに1~100まで探索しなくても、1~10までの探索でOKです。
def solve(): N, M = list(map(int, input().split())) # Mの約数をすべて調べる divs = set() # Mの約数を格納する n = 1 while n <= M**(1/2): if M%n == 0: # nがMの約数ならば divs.add(n) divs.add(M//n) n += 1 # Mの約数dの中で、M >= d*Nを満たす最大のものが答え ans = 0 for d in divs: if M >= d*N: ans = max(ans, d) print(ans) if __name__ == "__main__": solve()
計算量はです 。
2019/1/1にキングジム ブギーボード 電子メモパッド BB-1GXクロ クロをAmazonで購入しました。個人的にコードやアイデアの殴り書きに使っていてかなり気に入っていたのですが、2019/9/後半くらいに消去ボタンを押しても文字が消えなくなりました。寿命かな?と思ったけど、購入してから1年経ってないし、消去回数約5万回に達しているとは思えないので、初期不良品か故障か電池切れのどれかだろうなと思いました。まあそんなに高価なものでもないしおもちゃとしては面白かったので捨てようかなと思ったのですが、ダメ元ついでに分解してみることにしました。
唯一ネジ止めしてある裏側の4つのネジを外すと、ボタン電池を発見。ボタン電池を一旦外し、再度取り付けて消去ボタンを押すと文字が消えました。どうやら電池(電池のズレか、電池切れ)が原因だったっぽい。うちわのように仰いでたりしてたので、何かの拍子でズレたのかも。しらんけど。
ボタン電池はCR2025の3ボルト。電池交換したらまた使えるようになりました。
この型式のものは公式的には電池交換不可能なものなので、交換の際は自己責任でお願いします。
問題:AtCoder Beginner Contest 142: D - Disjoint Set of Common Divisors
公式解説PDF:https://img.atcoder.jp/abc142/editorial.pdf
公式解説動画:AtCoder Beginner Contest 142 - YouTube
要約すると、(gcd(A, B)を素因数分解したときの素因数の個数)+1が答え。
入力例2を考えます。
「420と660の正の公約数の中からいくつか約数を選んで、選んだやつのどの異なる2つの整数も互いに素となる最大の約数の個数は何か?」という問題になります。
420と660の正の公約数は、必ず最大公約数以下の値になります。よって約数のとりうる範囲は1 ~ 最大公約数
になります。420と660 の最大公約数gcd(420, 660)は60です。
60の約数を列挙してみます。
1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60
このうち、どの2つの整数も互いに素となる約数の個数が最大となる選び方は、
1, 2, 3, 5
の4つです。
見やすく表にして整理すると、
60の約数 | 1 | 2 | 3 | 4 | 5 | 6 | 10 | 12 | 15 | 20 | 30 | 60 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
答え | 1 | 2 | 3 | 5 |
たとえば15はなぜいけないのでしょうか?それは15を素因数分解すると なので、15を選ぶと3と5が選べなくなってしまいます。 よって15を選ぶより3と5を選んだほうが多くを選べるということになります。
12や20なんかも同様の理由で選べません。
4はどうでしょうか?これは素因数分解するとになります。つまり4を選ぶと2を選べなくなります。この2を選ばないパターンの1 3 4 5
は、どの2つの整数も互いに素となっているのでOKです。よって2の代わりに4を選ぶのはありですが、選ぶメリットは特にないですよね。素数しか選ばないというルールのほうが問題を簡単化できます。
ということで入力例2の場合では、gcd(420, 660)で最大公約数を求めて、その最大公約数を素因数分解したときの素因数を選べば、どの2つの整数も互いに素となります。あとついでに1も約数なのでこれも加えます。これが答えになります。
制約を考えます。Nがでかすぎるので、の解法はTLEします。
この問題におけるNとは、AとBの最大公約数gcd(A, B)の値です。1~gcd(A, B)
の範囲で素因数を数えることになります。gcd(A, B)の最大値はなので、は無理です。
ですが実は、最大公約数Nが何かの整数pで割り切れるときは、 と書けますので、となります(例: のとき、、 )。なのでNまで調べる必要はなく、で解くことができます。
このあたりの考え方はエラトステネスの篩とかで素数を数える問題を知っていて慣れていれば、で解けそうだなと当たりがつきます。
# -*- coding:utf-8 -*- import sys from fractions import gcd from collections import Counter def prime_factorization(n): """nを素因数分解する Return d(dict): 素因数をキー、素因数の指数部を値とするディクショナリを返す Example: n=140 -> d = {2: 2, 5: 1, 7: 1} """ d = Counter() m = 2 while m*m <= n: while n%m == 0: n //= m d[m] += 1 m = m + 1 if m == 2 else m + 2 # m=3からは、m+=2する(偶数は明らかに素数ではないので) if n > 1: d[n] += 1 return d def solve(): A, B = list(map(int, sys.stdin.readline().split())) cd = gcd(A, B) if cd == 1: # コーナーケース print(1) return # (素因数分解の素因数の個数)+1が答え prime_d = prime_factorization(cd) print(len(prime_d)+1) if __name__ == "__main__": solve()
計算量はです 。
なんか偉そうに「この問題に慣れていれば~」とか書きましたが、本番でTLEしてるんですよね。精進します。