您的位置:首页 > 其它

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

2017-04-16 11:13 316 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: