만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

전등 끄기

시간 제한2초메모리 제한256 MB

요약
각 시작 위치 p마다 모든 전구를 끄는 최소 이동 횟수를 구합니다. 그다음 p와 그 횟수를 곱해 모두 더한 값을 10^9+7로 나눈 나머지로 출력합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 그리디, 누적 합
정답자
아직 제출이 없습니다

문제

직선 위에 nn개의 전등이 놓여 있고, 왼쪽에서 오른쪽으로 11번부터 nn번까지 번호가 매겨져 있다. 처음에는 일부 전등이 켜져 있다. 치아키는 모든 전등을 끄려고 한다.

치아키는 pp번 전등에서 출발한다. 한 번의 동작에서 왼쪽이나 오른쪽으로 한 칸 이동한 뒤, 그 위치 전등의 스위치를 누른다. 스위치를 누르면 켜져 있던 전등은 꺼지고, 꺼져 있던 전등은 켜진다.

각 p=1,2,…,np=1,2,\dots,n에 대해, 모든 전등을 끄는 데 필요한 최소 동작 횟수를 구하라.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스는 다음과 같다.

첫 줄에 전등의 개수 nn (2≤n≤1062 \le n \le 10^6)이 주어진다.

둘째 줄에 이진 문자열 ss가 주어진다. si=1s_i=1이면 ii번 전등이 켜져 있고, si=0s_i=0이면 꺼져 있다.

모든 테스트 케이스의 nn을 합한 값은 10710^7을 넘지 않는다.

출력

각 테스트 케이스에 대해 (∑i=1∣s∣i×zi) mod (109+7)\left(\sum_{i=1}^{|s|} i \times z_i\right) \bmod (10^9+7)을 출력한다. 여기서 ziz_i는 치아키가 ii번 전등에서 출발할 때 필요한 최소 동작 횟수이다.

예제1

  1. 예제 1

    입력
    3
    3
    000
    3
    111
    8
    01010101
    
    예상 출력
    0
    26
    432