LibreOJ #6220. sum(数论+构造)

  题目大意:在数组中找出一些数,使它们的和能被n整除

  这题标签是数学,那我就标题就写数论好了...

  显然如果数组中有n的倍数直接取就行。

  那假设数组中没有n的倍数,把数组中的数求前缀和后全部%n,会得到一堆1~n-1的数(注意没有0,有0直接就可以取这个前缀了),那根据抽屉原理一定有两个相同的数,设这两个相同的数所在的位置为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=,inf=1e9;
ll n,sum;
ll a[maxn],v[maxn];
void read(ll &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(n);sum=;
for(int i=;i<=n;i++)
{
read(a[i]);
sum=(sum+a[i])%n;
if(!v[sum])v[sum]=i;
else
{
for(int j=v[sum]+;j<=i;j++)printf("%d %lld\n",j,a[j]);
return ;
}
}
return ;
}
上一篇:Json-lib使用 转载


下一篇:Qt之进程间通信(共享内存)