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=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} int main()
{
in(n);
for(int i=;i<=n;i++) in(ai[i]),sum[i]=(sum[i-]+ai[i])%n;
for(int i=;i<=n;i++)
{
if(sum[i]==)
{
printf("%d\n",i);
for(int j=;j<=i;j++) printf("%d\n",ai[j]);
return ;
}
if(ioss[sum[i]]==) ioss[sum[i]]=i;
else
{
int pos=ioss[sum[i]];
printf("%d\n",i-pos);
for(int j=pos+;j<=i;j++)
{
printf("%d\n",ai[j]);
}
return ;
}
}
printf("No Solution\n");
return ;
}

疯狂优化没什么卵用版:

#include <cstdio>

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

inline void w(register int x)
{
if(x>) w(x/);
putchar(x%+);
} int main()
{
scanf("%d",&n);
int *a=&u[],*b=&s[];
for(int i=;i<=n;i++)
{
a++,b++;
register char Cget=getchar();*a=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
*a=*a*+Cget-'';
Cget=getchar();
}
*b=(s[i-]+*a)%n;
if(*b==)
{
w(i),putchar('\n');
for(register int *p=&u[];p!=&u[i+];p++) w(*p),putchar('\n');
return ;
}
if(o[*b]==) o[*b]=i;
else
{
int pos=o[*b];
w(i-pos),putchar('\n');
for(register int *p=&u[pos+];p!=&u[i+];p++) w(*p),putchar('\n');
return ;
}
}
printf("No Solution\n");
return ;
}
上一篇:1103 N的倍数


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