1. 程式人生 > >數列(NOIP17提高模擬訓練11)

數列(NOIP17提高模擬訓練11)

輸出格式 with set while 一行 cnblogs cpp tdi nbsp

給你一個長度為N的正整數序列,如果一個連續的子序列,子序列的和能夠被K整
除,那麽就視此子序列合法,求原序列包括多少個合法的連續子序列?
對於一個長度為8的序列,K=4的情況:2, 1, 2, 1, 1, 2, 1, 2 。它的答案為6,子序列
是位置1->位置8,2->4,2->7,3->5,4->6,5->7。

輸入格式:

第一行:T,表示數據組數
對於每組數據:
第一行:2個數,K,N
第二行:N個數,表示這個序列

輸出格式:

共T行,每行一個數表示答案

樣例輸入:

2
7 3
1 2 3
4 8
2 1 2 1 1 2 1 2

樣例輸出:

0
6

數據範圍:

100%數據滿足
1<=T<=20
1<=N<=50000
1<=K<=1000000
序列的每個數<=1000000000
30%數據滿足
1<=T<=10
1<=N,K<=1000

和上次寫的思路是一樣的,這裏不多闡述~

include<bits/stdc++.h>
using namespace std;
 
int book[2301000];
 
int main()
{
    int t;
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        long long k,n;
        memset(book,0,sizeof(book));
        cin>>k>>n;
        long long sum=0;
        long long x;
        long long ans=0;
        for(int i=1;i<=n;i++)
        {
            cin>>x;
            sum=(sum+x)%k;
            book[sum%k]++;
        }
        for(int i=0;i<=k-1;i++)
            ans+=book[i]*(book[i]-1)/2;
        cout<<ans+book[0]<<endl;
       }
    return 0;
}

  

數列(NOIP17提高模擬訓練11)