AC日记——N的倍数 51nod 1103

1103 N的倍数

思路:

  先计算出前缀和;

  然后都%n;

  因为有n个数,所以如果没有sum[i]%n==0的化,一定有两个取模后的sum相等;

  输出两个sum中间的数就好;

来,上代码:

#include <cstdio>

using namespace std;

#define maxn 50005

int n,ai[maxn],sum[maxn],ioss[maxn];

inline void in(int &now)
{
    register char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}

int main()
{
    in(n);
    for(int i=1;i<=n;i++) in(ai[i]),sum[i]=(sum[i-1]+ai[i])%n;
    for(int i=1;i<=n;i++)
    {
        if(sum[i]==0)
        {
            printf("%d\n",i);
            for(int j=1;j<=i;j++) printf("%d\n",ai[j]);
            return 0;
        }
        if(ioss[sum[i]]==0) ioss[sum[i]]=i;
        else
        {
            int pos=ioss[sum[i]];
            printf("%d\n",i-pos);
            for(int j=pos+1;j<=i;j++)
            {
                printf("%d\n",ai[j]);
            }
            return 0;
        }
    }
    printf("No Solution\n");
    return 0;
}

疯狂优化没什么卵用版:

#include <cstdio>

int n,u[50001],s[50001],o[50001];

inline void w(register int x)
{
    if(x>9) w(x/10);
    putchar(x%10+48);
}

int main()
{
    scanf("%d",&n);
    int *a=&u[0],*b=&s[0];
    for(int i=1;i<=n;i++)
    {
        a++,b++;
        register char Cget=getchar();*a=0;
        while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
        while(Cget>=‘0‘&&Cget<=‘9‘)
        {
            *a=*a*10+Cget-‘0‘;
            Cget=getchar();
        }
        *b=(s[i-1]+*a)%n;
        if(*b==0)
        {
            w(i),putchar(‘\n‘);
            for(register int *p=&u[1];p!=&u[i+1];p++) w(*p),putchar(‘\n‘);
            return 0;
        }
        if(o[*b]==0) o[*b]=i;
        else
        {
            int pos=o[*b];
            w(i-pos),putchar(‘\n‘);
            for(register int *p=&u[pos+1];p!=&u[i+1];p++) w(*p),putchar(‘\n‘);
            return 0;
        }
    }
    printf("No Solution\n");
    return 0;
}
时间: 2024-10-12 16:53:07

AC日记——N的倍数 51nod 1103的相关文章

AC日记——还是01串 51nod 1396

还是01串 思路: 前缀和: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 1000005 int n,sum[maxn]; char ch[maxn]; int main() { gets(ch),n=strlen(ch); for(int i=0;i<n;i+

AC日记——Aragorn&#39;s Story HDU 3966

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10510    Accepted Submission(s): 2766 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

51nod 1103 N的倍数

1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < 

51NOD 1103 N的倍数(抽屉原理)

传送门 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < A[i] <= 10^9) Output 如果没有符合条件的组合,输出No Solution. 第1行:1个数S表示你所选择的数的数量.

51nod 1103 N的倍数 思路:抽屉原理+前缀和

题目: 这是一道很神奇的题目,做法非常巧妙.巧妙在题目要求n个数字,而且正好要求和为n的倍数. 思路:用sum[i]表示前i个数字的和%n.得到sum[ 1-N ]共N个数字. N个数字对N取模,每个数字都在0-( N-1 )之间. 可能出现两种情况  1:有一个数字等于0.(都不相等)   2:至少有两个数字相等. 1.如果sum数组中有一个数字sum[i]=0,说明前i个数字的和为N的倍数. 2.如果sum[i]==sum[j],说明第i-( j-1 )或者( i+1 )-j的和为N的倍数.

AC日记——最小正子段和 51nod 1065

最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 50005 #define ll long long #define INF 0x7fffffff str

AC日记——石子归并 51nod 1021

石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algori

51nod 1103 N的倍数 (抽屉原理)

题目链接:传送门 题意: 略. 分析: 把前缀和统计出来对n取模,任意连个相等的sum[i],sum[j],[i,j]内的数的和都满足这个条件. n个数对n取模,范围为[0~n-1],由抽屉原理可知,最少有一个数模n=0,或者两个数模n相等. 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 50010; LL a[maxn],sum[maxn]; int mai

AC日记——3的幂的和 51nod 1013

3的幂的和 思路: 矩阵快速幂:   sn-1      3 1        sn   *          = 1     0 1  1 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define mod 1000000007 struct NodeType { long long a[3