【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;
         }
     }
}
View Code

 

posted @ 2017-08-22 18:48  ONION_CYC  阅读(174)  评论(0编辑  收藏  举报