【LibreOJ】【LOJ】#6220. sum
【题意】对于n个数,找出一些数使得它们的和能被n整除,输出任意一组方案,n<=10^6。
【算法】构造/结论
【题解】引用自:http://www.cnblogs.com/Sakits/p/7407103.html by Sakits
对n个数求前缀和,即sum[i]=sigma(a[1~i])%n,若sum[i]=0则找到答案,否则n个前缀和填充1~n-1,根据抽屉原理必有两个前缀和相同,则中间那一段数字之和是n的倍数。
#include<cstdio> long long s,n,b[1000020],a[1000020]; int main(){ scanf("%lld",&n); b[0]=1; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); s=(s+a[i])%n; if(!b[s])b[s]=i+1;else{ for(int j=b[s];j<=i;j++)printf("%d %lld\n",j,a[j]); break; } } }