今日の問題
↑押してください。
自分の回答(javascript)
function Main(input){
min = 1e18
max = -1e18
let abc = "abcdefghijklmnopqrstuvwxyz".split("")
let ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
let f = 3
if(f == 0){
input = parseInt(input.trim())
}
if(f == 1){
input = input.trim().split("\n").map((a)=>parseInt(a))
}
if(f == 2){
input = input.trim().split("\n").map((a)=>a.split(" ").map((b)=>parseInt(b)))
}
if(f == 3){
input = input.trim().split("\n")
}
//ここより上は定型文です。
let [n,s] = input.shift().split(" ")
let alist = input.shift().split(" ").map((a)=>parseInt(a))
total= 0n
n = parseInt(n)
s = BigInt(s)
for(let i = 0;i<n;i++){
total = total + BigInt(alist[i])
}
kaisu = s/(total)
//console.log(s,total)
if(s%total == 0){
console.log("Yes")
return
}
a = total*BigInt(kaisu)
sakujo = 0
//console.log(a,total)
now = a
if(now == s){
console.log("Yes")
return
}
n = n*2
for(let i = 0;i<n;i++){
alist.push(alist[i])
}
for(let tuika = 0;tuika<n;tuika++){
now += BigInt(alist[tuika])
//console.log(now)
while(now > s&&sakujo<n){
//console.log(alist[l])
now -= BigInt(alist[sakujo])
sakujo ++
}
if(now == s){
console.log("Yes")
return
}
}
console.log("No")
}
Main(require("fs").readFileSync(0, "utf8"));
工夫した点
とりあえずまるまる使う区間がいくつかあるのでそれを引いて高速化します。それから端数を尺取法を使って、合うかを確認します。sが10^18であるためBigIntで扱います。注意してください。