51nod 1103 N的倍數 抽屜原理

2021-08-17 07:14:06 字數 753 閱讀 5355

這題是特判,所以找到任何乙個結果都可,有這麼幾種情況

a[i]即為n的倍數,那麼輸出1和a[i]即可

一直求和直到對n取模後為0,那麼從頭輸出到i即可

非從頭的幾個數求和為n的倍數,我們講一下3情況的實現

我們用字首和,把每次讀入的數加到字首和中,並對字首和取模,由於一直加為取模後為0的情況在2討論過了,那麼在情況3中取模的結果只有在1到n-1,這n-1種可能,根據抽屜原理又稱鴿巢原理,把n個球放入n-1個抽屜那麼必有乙個抽屜中大於1個球,也就是說我們一共有n個字首和,但是取模的可能只有n-1種,那麼必定有兩個字首和相等,當字首和相等時,兩個字首和之間的元素相加即為n的倍數

#include 

#include

#include

#include

#include

using

namespace

std;

int a[50005];

int vis[50005];

int sum[50005];

int main()

if(i==0)

sum[i]=a[i];

else

sum[i]=sum[i-1]+a[i];

sum[i]%=n;

if(sum[i]==0)

if(vis[sum[i]]!=-1)

vis[sum[i]]=i;

}return

0;}

51nod 1103 N的倍數 (抽屜原理)

乙個長度為n的陣列a,從a中選出若干個數,使得這些數的和是n的倍數。例如 n 8,陣列a包括 2 5 6 3 18 7 11 19,可以選2 6,因為2 6 8,是8的倍數。input 第1行 1個數n,n為陣列的長度,同時也是要求的倍數。2 n 50000 第2 n 1行 陣列a的元素。0 a i...

51nod 1103 N的倍數 抽屜原理

原題鏈結 1103 n的倍數 ural 1302 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個長度為n的陣列a,從a中選出若干個數,使得這些數的和是n的倍數。例如 n 8,陣列a包括 2 5 6 3 18 7 11 19,可以選2 6,因為2 6 8,是8...

51nod 1103 N的倍數(抽屜定理)

題目 思路 首先明確,輸出任意乙個答案即可 求mod n的字首和,然後如果0就是答案,如果沒有等於0的,考慮mod n結果只能是1 n 1,所以根據抽屜定理 鴿巢定理 若把n個物體放在n 1個抽屜中,至少有乙個抽屜中放了兩個物體 所以肯定有兩個相同的字首和,相減就是結果了 include using...