C. Removing Smallest Multiples

time limit per test

2 seconds

memory limit per test

256 megabytes

You are given a set S, which contains the first n positive integers: 1,2,...,n.

You can perform the following operation on S any number of times (possibly zero):

  • Choose a positive integer k where 1≤k≤n, such that there exists a multiple of k in S. Then, delete the smallest multiple of k from S. This operation requires a cost of k.

You are given a set T, which is a subset of S. Find the minimum possible total cost of operations such that S would be transformed into T. We can show that such a transformation is always possible.

Input

The first line of the input contains a single integer t (1≤t≤10000) --- the number of test cases. The description of the test cases follows.

The first line contains a single positive integer n (1≤n≤106).

The second line of each test case contains a binary string of length n, describing the set T. The i-th character of the string is '1' if and only if i is an element of T, and '0' otherwise.

It is guaranteed that the sum of n over all test cases does not exceed 106.

Output

For each test case, output one non-negative integer --- the minimum possible total cost of operations such that S would be transformed into T.

Example

Input

Copy

复制代码

6

6

111111

7

1101001

4

0000

4

0010

8

10010101

15

110011100101100

Output

Copy

复制代码
0
11
4
4
17
60

Note

In the first test case, we shall not perform any operations as S is already equal to T, which is the set {1,2,3,4,5,6}.

In the second test case, initially, S={1,2,3,4,5,6,7}, and T={1,2,4,7}. We shall perform the following operations:

  1. Choose k=3, then delete 3 from S.
  2. Choose k=3, then delete 6 from S.
  3. Choose k=5, then delete 5 from S.

The total cost is 3+3+5=11. It can be shown that this is the smallest cost possible.

In the third test case, initially, S={1,2,3,4} and T={} (empty set). We shall perform 4 operations of k=1 to delete 1, 2, 3, and 4.

In the fourth test case, initially, S={1,2,3,4} and T={3}. We shall perform two operations with k=1 to delete 1 and 2, then perform one operation with k=2 to delete 4.

解题说明:此题是一道模拟题,采用贪心算法,可以将输入数列当成字符串处理,然后循环遍历,每次找出等于0的数字,让其变成1。考虑到是k的最小倍数,内层循环中步长设置为k即可。

cpp 复制代码
#include <stdio.h>
#include <string.h>

int arr[1000005];
char s[1000005];

int main()
{
    int t;
    scanf("%d", &t);

    while (t--) 
    {
        int n;
        scanf("%d", &n);
        scanf("%s", s + 1);

        for (int i = 1; i <= n; i++)
        {
            arr[i] = 0;
        }
        long long ans = 0;

        for (int k = 1; k <= n; k++)
        {
            for (int j = k; j <= n; j += k)
            {
                if (s[j] == '1')
                {
                    break;
                }
                if (!arr[j]) 
                {
                    arr[j] = 1;
                    ans += k;
                }
            }
        }

        printf("%lld\n", ans);
    }

    return 0;
}
相关推荐
传奇开心果编程2 小时前
【Rust入门练中学】第8课:错误处理
开发语言·rust·错误处理·编程语言理论·通用编程语言
郑同学的笔记3 小时前
【c++随笔30】C++ 注册回调函数
开发语言·c++
七夜zippoe3 小时前
启元 Q1 腿部运动学逆解:Python 算站立下蹲关节角
开发语言·python·ai·机器人·腿部运动学
熊猫钓鱼>_>3 小时前
精准碰一碰近场分享与拖拽投送实战:把文件“碰“进另一台设备【鸿蒙心迹】
开发语言·华为·harmonyos·鸿蒙·openharmony
CodeGL4 小时前
9、Python基础之IO编程
开发语言·数据库·python
曹牧4 小时前
SVN:失联项目
开发语言
传奇开心果编程4 小时前
【Rust入门练中学】第9课:集合类型
开发语言·rust·编程语言理论·集合类型·通用编程语言
龙孚信息4 小时前
跨境电商独立站的安全盲区:一次 PHP 核心漏洞的影响评估
开发语言·安全·php
牛牛牌蜡笔小新5 小时前
Java-常用类库
java·开发语言
sunsijia219835 小时前
2026年10月22日 PHP漏洞临时处理
开发语言·php