题目大意:在数组中找出一些数,使它们的和能被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; }
时间: 2024-11-10 09:34:35