結果
| 問題 |
No.106 素数が嫌い!2
|
| コンテスト | |
| ユーザー |
guricerin
|
| 提出日時 | 2020-02-06 13:10:59 |
| 言語 | F# (F# 4.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,633 bytes |
| コンパイル時間 | 11,073 ms |
| コンパイル使用メモリ | 201,892 KB |
| 実行使用メモリ | 69,632 KB |
| 最終ジャッジ日時 | 2024-09-25 06:45:36 |
| 合計ジャッジ時間 | 23,758 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | TLE * 1 -- * 12 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.fsproj を復元しました (255 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) /home/judge/data/code/Main.fs(110,9): warning FS0025: この式のパターン マッチが不完全です たとえば、値 '[|_; _; _|]' はパターンに含まれないケースを示す可能性があります。 [/home/judge/data/code/main.fsproj] main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
open System
open System.Collections.Generic
[<AutoOpen>]
module Cin =
let read f = stdin.ReadLine() |> f
let reada f = stdin.ReadLine().Split() |> Array.map f
let readChars() = read string |> Seq.toArray
let readInts() = readChars() |> Array.map (fun x -> Convert.ToInt32(x.ToString()))
[<AutoOpen>]
module Cout =
let writer = new IO.StreamWriter(new IO.BufferedStream(Console.OpenStandardOutput()))
let print (s: string) = writer.Write s
let println (s: string) = writer.WriteLine s
let inline puts (s: ^a) = string s |> println
// -----------------------------------------------------------------------------------------------------
module Prime =
let inline isPrime (n: int) =
let limit =
n
|> float
|> sqrt
|> int
seq {
for p in 2 .. limit do
if n % p = 0 then yield ()
}
|> Seq.isEmpty
/// nを素因数分解した結果を返す
let primeFactors (n: int64): Map<int64, int64> =
let limit =
n
|> float
|> sqrt
|> int64
let rec count x p acc =
if x % p = 0L then count (x / p) p (acc + 1L) else acc
let mutable n = n
let res =
seq {
for p in 2L .. limit + 1L do
let c = count n p 0L
if c <> 0L then
let div = (float p) ** (float c) |> int64
n <- n / div
yield (p, c)
}
|> Map.ofSeq
if n = 1L then res else res.Add(n, 1L)
/// nの約数の個数
let divisorsCount (n: int64): int64 = primeFactors n |> Map.fold (fun acc k v -> acc * (v + 1L)) 1L
/// upper以下の素数を列挙
let sieveToUpper upper =
seq {
yield 2
let knownComposites = System.Collections.Generic.SortedSet<int>()
for i in 3 .. 2 .. upper do
let found = knownComposites.Contains(i)
if not found then yield i
for j in i .. i .. upper do
knownComposites.Add(j) |> ignore
}
/// 添え字が素数かどうかを表す配列を返す
let eraSieve upper =
let upper = int upper + 1
let res = Array.init upper (fun _ -> true)
res.[0] <- false
res.[1] <- false
let rec loop a b =
let c = a * b
if c >= upper then
()
else
res.[c] <- false
loop a (b + 1)
for i in 2 .. upper - 1 do
if res.[i] then loop i 2
res
/// nの約数を列挙(n自身を含む)
/// O(log n)
let divisors (n: int64): int64 array =
let lim =
n
|> float
|> sqrt
|> int64
seq {
for i in 1L .. lim do
if n % i = 0L then
yield i
if i * i <> n then yield n / i
}
|> Array.ofSeq
|> Array.sort
// -----------------------------------------------------------------------------------------------------
let main() =
let [| n; k |] = reada int
let mp = Array.zeroCreate (n + 1)
for i in 2 .. n do
let fack = Prime.primeFactors (int64 i)
mp.[i] <- Seq.length fack
mp.[2..]
|> Array.filter (fun x -> x >= k)
|> Array.length
|> puts
()
// -----------------------------------------------------------------------------------------------------
main()
writer.Dispose()
guricerin