给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。

问题描述

给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。

你能求出数列中总共有多少个K倍区间吗?

输入格式

第一行包含两个整数N和K。(1 <= N, K <= 100000)

以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)

输出格式

输出一个整数,代表K倍区间的数目。

样例输入

5 2
1
2
3
4
5

样例输出

6

以下程序实现了该功能,请你补全空白处代码:

```c
#include <bits/stdc++.h>
using namespace std;

int main()
{
long long n, k, ans = 0, son[100000], sum[100000], b[100000] = {0};
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> son[i];
if (i != 0)
__________________;
else
sum[i] = son[i] % k;
b[sum[i]]++;
ans += b[sum[i]] - 1;
if (sum[i] == 0)
ans++;
}
cout << ans;
return 0;
}

```这题我看不懂,不知道是什么意思,您能教教我吗?

这篇应该是,全网这题数一数二的讲解了,我看了一遍都懂了,你看看:

参考 https://blog.csdn.net/qq_51314467/article/details/122597965?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168991955016800197098045%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168991955016800197098045&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-122597965-null-null.142^v90^control_2,239^v3^insert_chatgpt&utm_term=%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%E9%95%BF%E5%BA%A6%E4%B8%BAN%E7%9A%84%E6%95%B0%E5%88%97%EF%BC%8CA1%2C%20A2%2C%20%E2%80%A6%20AN%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%85%B6%E4%B8%AD%E4%B8%80%E6%AE%B5%E8%BF%9E%E7%BB%AD%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97Ai%2C%20Ai%2B1%2C%20%E2%80%A6%20Aj%28i%20%3C%3D%20j%29%E4%B9%8B%E5%92%8C%E6%98%AFK%E7%9A%84%E5%80%8D%E6%95%B0%EF%BC%8C%E6%88%91%E4%BB%AC%E5%B0%B1%E7%A7%B0%E8%BF%99%E4%B8%AA%E5%8C%BA%E9%97%B4%5Bi%2C%20j%5D%E6%98%AFK%E5%80%8D%E5%8C%BA%E9%97%B4&spm=1018.2226.3001.4187

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7630771
  • 除此之外, 这篇博客: 给你一根长度为n的绳子,请把绳子剪成整数长的m段,每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多中的 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 解题过程:类比上述案例截图过程。则有
    1.分析题意:
    绳子长度为n,分成m分,那先设分后每份长度为x, 份数m=n/x
    那么结果就是 n/x个 x 相乘 f(x)=(n/x)(n/x)…*(n/x) = x^(n/x).

    因为maxMul = f(x) = x^(n/x);
    两边同时求对数,则有:ln(f(x)) = n/x(lnx);
    两边同时求导。则有:
    

    在这里插入图片描述
    有上述求导过程可知。当x = 3时候。m = n/x有以下三种情况:

    1. f(x) = 3^n/3  n%3 ==0;
    2. f(x) = 3^(n/3-1)*4 n%3 ==1;
    3. f(x) = 3^(n/3)*2;
    

    注意:另外还需考虑绳子的长度小于3的情况。
    完整代码如下:

    public class Solution {
        public int cutRope(int target) {
            if(target == 2){return 1;}
            if(target == 3){return 2;}
            if(target >=4){
                if(target % 3 == 0){
                    return (int)Math.pow(3,target/3);
                }else if(target % 3 == 1){
                    return 4*(int)Math.pow(3,target/3 -1);
                }else{
                    return 2*(int)Math.pow(3,target/3);
                }
            }
            return 0;
        }
    }