zoukankan      html  css  js  c++  java
  • 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=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
    ",j,a[j]);
                return 0;
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
  • 原文地址:https://www.cnblogs.com/Sakits/p/7407103.html
Copyright © 2011-2022 走看看