from math import gcd
from collections import defaultdict
def findVulnerabilityFactor(key, maxChange):
from math import gcd
from functools import lru_cache
n = len(key)
# Helper: Compute GCD of subarray from l to r
def subarray_gcd(arr):
g = arr[0]
for num in arr[1:]:
g = gcd(g, num)
if g == 1:
return 1
return g
# Check if it's possible to make all subarrays of length > L have GCD == 1
def is_valid(L):
for i in range(n):
g = 0
cnt = 0
for j in range(i, n):
g = gcd(g, key[j])
if g == 1:
break
cnt += 1
if cnt > L:
# Try to break it with at most maxChange changes
# Try changing elements to 1 inside window [i..j]
# Count how many need to be changed to make GCD 1
change_needed = 0
for k in range(i, j + 1):
if key[k] % g == 0:
change_needed += 1
if change_needed <= maxChange:
continue
else:
return False
return True
# Binary search on the minimum vulnerability factor
left, right = 0, n
answer = n
while left <= right:
mid = (left + right) // 2
if is_valid(mid):
answer = mid
right = mid - 1
else:
left = mid + 1
return answer
def main():
# Test Case 1
key1 = [2, 2, 4, 9, 6]
maxChange1 = 1
result1 = findVulnerabilityFactor(key1, maxChange1)
print(f"Test Case 1: Vulnerability Factor = {result1}") # Expected: 2
# Test Case 2
key2 = [5, 10, 20, 10, 15, 5]
maxChange2 = 2
result2 = findVulnerabilityFactor(key2, maxChange2)
print(f"Test Case 2: Vulnerability Factor = {result2}") # Expected: 2
if __name__ == "__main__":
main()
ZnJvbSBtYXRoIGltcG9ydCBnY2QKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKCmRlZiBmaW5kVnVsbmVyYWJpbGl0eUZhY3RvcihrZXksIG1heENoYW5nZSk6CiAgICBmcm9tIG1hdGggaW1wb3J0IGdjZAogICAgZnJvbSBmdW5jdG9vbHMgaW1wb3J0IGxydV9jYWNoZQoKICAgIG4gPSBsZW4oa2V5KQoKICAgICMgSGVscGVyOiBDb21wdXRlIEdDRCBvZiBzdWJhcnJheSBmcm9tIGwgdG8gcgogICAgZGVmIHN1YmFycmF5X2djZChhcnIpOgogICAgICAgIGcgPSBhcnJbMF0KICAgICAgICBmb3IgbnVtIGluIGFyclsxOl06CiAgICAgICAgICAgIGcgPSBnY2QoZywgbnVtKQogICAgICAgICAgICBpZiBnID09IDE6CiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgIHJldHVybiBnCgogICAgIyBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIG1ha2UgYWxsIHN1YmFycmF5cyBvZiBsZW5ndGggPiBMIGhhdmUgR0NEID09IDEKICAgIGRlZiBpc192YWxpZChMKToKICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKICAgICAgICAgICAgZyA9IDAKICAgICAgICAgICAgY250ID0gMAogICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBuKToKICAgICAgICAgICAgICAgIGcgPSBnY2QoZywga2V5W2pdKQogICAgICAgICAgICAgICAgaWYgZyA9PSAxOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBjbnQgKz0gMQogICAgICAgICAgICAgICAgaWYgY250ID4gTDoKICAgICAgICAgICAgICAgICAgICAjIFRyeSB0byBicmVhayBpdCB3aXRoIGF0IG1vc3QgbWF4Q2hhbmdlIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAjIFRyeSBjaGFuZ2luZyBlbGVtZW50cyB0byAxIGluc2lkZSB3aW5kb3cgW2kuLmpdCiAgICAgICAgICAgICAgICAgICAgIyBDb3VudCBob3cgbWFueSBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gbWFrZSBHQ0QgMQogICAgICAgICAgICAgICAgICAgIGNoYW5nZV9uZWVkZWQgPSAwCiAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2UoaSwgaiArIDEpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBrZXlba10gJSBnID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VfbmVlZGVkICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBjaGFuZ2VfbmVlZGVkIDw9IG1heENoYW5nZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgQmluYXJ5IHNlYXJjaCBvbiB0aGUgbWluaW11bSB2dWxuZXJhYmlsaXR5IGZhY3RvcgogICAgbGVmdCwgcmlnaHQgPSAwLCBuCiAgICBhbnN3ZXIgPSBuCiAgICB3aGlsZSBsZWZ0IDw9IHJpZ2h0OgogICAgICAgIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8vIDIKICAgICAgICBpZiBpc192YWxpZChtaWQpOgogICAgICAgICAgICBhbnN3ZXIgPSBtaWQKICAgICAgICAgICAgcmlnaHQgPSBtaWQgLSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGVmdCA9IG1pZCArIDEKICAgIHJldHVybiBhbnN3ZXIKCmRlZiBtYWluKCk6CiAgICAjIFRlc3QgQ2FzZSAxCiAgICBrZXkxID0gWzIsIDIsIDQsIDksIDZdCiAgICBtYXhDaGFuZ2UxID0gMQogICAgcmVzdWx0MSA9IGZpbmRWdWxuZXJhYmlsaXR5RmFjdG9yKGtleTEsIG1heENoYW5nZTEpCiAgICBwcmludChmIlRlc3QgQ2FzZSAxOiBWdWxuZXJhYmlsaXR5IEZhY3RvciA9IHtyZXN1bHQxfSIpICAjIEV4cGVjdGVkOiAyCgogICAgIyBUZXN0IENhc2UgMgogICAga2V5MiA9IFs1LCAxMCwgMjAsIDEwLCAxNSwgNV0KICAgIG1heENoYW5nZTIgPSAyCiAgICByZXN1bHQyID0gZmluZFZ1bG5lcmFiaWxpdHlGYWN0b3Ioa2V5MiwgbWF4Q2hhbmdlMikKICAgIHByaW50KGYiVGVzdCBDYXNlIDI6IFZ1bG5lcmFiaWxpdHkgRmFjdG9yID0ge3Jlc3VsdDJ9IikgICMgRXhwZWN0ZWQ6IDIKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCk=