數論 整除 中山紀念中學暑期遊Day1 數列

2021-09-25 20:29:28 字數 1762 閱讀 8432

巨水水水水的一道題,居然沒做起,30分騙分完全在諷刺當時的自己好嗎qwq...

給你乙個長度為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。

input

第一行:t,表示資料組數

對於每組資料:

第一行:2個數,k,n

第二行:n個數,表示這個序列

output

共t行,每行乙個數表示答案

sample input

2 

7 3

1 2 3

4 8

2 1 2 1 1 2 1 2

sample output

0 

6

100%資料滿足

1<=t<=20

1<=n<=50000

1<=k<=1000000

序列的每個數<=1000000000

30%資料滿足

1<=t<=10

1<=n,k<=1000

字首和+「餘數」思想+排列組合

1)預處理字首和and各字首和mod k 的個數

2)餘數相同的字首和數列相減得出——餘數為0的子串行

3)排列組合一下:餘數為 i 的字首和數列個數設為cnt[ i ],它們兩兩組合可以有cnt[ i ]*( cnt[ i ]-1 )種情況,答案cnt[ 0 ]~cnt[ k-1 ]累加即可

有乙個細節是cnt[ 0 ] (mod k 餘數為0的字首和數列個數)最後要單獨加一次,或者其初值附為1,因為它自己就可以整除,不需要和別的字首和數列相減

//已確認會超時orz... 

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=50000;

ll a[maxn+5],pre[maxn+5];

int k,n;

int main()

for(int i=1;i<=n;i++)

for(int j=1;j<=n-i+1;j++)//子串行開頭位置

printf("%d\n",ans);

} return 0;

}

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=5e4,maxk=1e6;

ll a[maxn+5],pre[maxn+5],cnt[maxk+5];

int k,n,ans;

void init()

int main()

for(int i=0;i<=k-1;i++)

if(cnt[i]>=1)

ans+=cnt[i]*(cnt[i]-1);

printf("%d\n",ans/2);

} return 0;

}

2019 遊記 中山紀念中學暑期遊Day3

今天沒有考試,專門講課,聽不懂的同學還可以回機房瞎搞 感覺安排的還可以,至少時間還是挺充裕的,只是講解的內容太多了,消化不完qaq.早上依舊沒有早起.三天過去了,我連有沒有鈴聲都不知道 去食堂吃了乙個椰蓉麵包 學校居然取名 奶皇麵包 是的,我字沒有打錯,看起來就是這樣高大上,然鵝吃起來像批發的 乙個...

2019 遊記 中山紀念中學暑期遊Day6

今天的安排是 聽課!資料結構 專題,花了一早上和一下午,晚上在搞乙個兄弟自己出的題目 賊坑 於是時間又沒了qaq.真心覺得時間怎麼都不夠用啊咧.早上還是沒有早起成功,於是匆匆趕往食堂,居然有公尺漢堡 公尺飯夾雞肉 吃得還算滿意qwq 來到報告廳,座位不出所料的被佔滿了,可是還是get到乙個c位 人品...

2019 遊記 中山紀念中學暑期遊Day9

昨天去珠海玩了下,感覺還不錯誒,就是好熱好曬.很想細寫但是沒時間,故事大多都在 上了 其實現在正在打字的我是10號的我.來填坑了23333.詳情記不到了,直接說考試 這次考試真的考得好炸,都是難以暴力應付的題qwq.第一題 自己想到了是dp,而且和正解的狀態定義都一樣!但是不會打,這就很現實了.暴力...