1. 程式人生 > >LibreOJ #6220. sum(數論)

LibreOJ #6220. sum(數論)

define onclick const 全部 註意 img long long %d mes

  題目大意:在數組中找出一些數,使它們的和能被n整除

  這題標簽是數學,那我就標題就寫數論好了...

  顯然如果數組中有n的倍數直接取就行。

  那假設數組中沒有n的倍數,把數組中的數求前綴和後全部%n,會得到一堆1~n-1的數(註意沒有0,因為數組中沒有n的倍數),那根據抽屜原理一定有兩個相同的數,設這兩個相同的數所在的位置為l和r,那麽下標在[l+1,r]的這些數的和一定是n的倍數

  記得開LL,我還RE兩發QAQ

技術分享
#include<iostream>
#include<cstdlib>
#include<cstring>
#include
<cstdio> #define ll long long using namespace std; const int maxn=1000050,inf=1e9; ll n,sum; ll a[maxn],v[maxn]; void read(ll &k) { int f=1;k=0;char c=getchar(); while(c<0||c>9)c==-&&(f=-1),c=getchar(); while(c<=9&&c>=0)k=k*10+c-0,c=getchar(); k
*=f; } int main() { read(n);sum=0; for(int i=1;i<=n;i++) { read(a[i]); sum=(sum+a[i])%n; if(!v[sum])v[sum]=i; else { for(int j=v[sum]+1;j<=i;j++)printf("%d %lld\n",j,a[j]); return 0; } }
return 0; }
View Code

LibreOJ #6220. sum(數論)