poj 2356 http://poj.org/problem?id=2356
import java.util.Scanner;
public class Main {
//抽屉原理(鸽巢原理)最基础的原理便是n+1的物体放到n个盒子里,至少有一个盒子放了两个物体
//有n个数,从中选出几个数的和是n的倍数。
//结论是任意的n个数,必然能找到连续的m个数之和是n的倍数。
//组合数学书中,黑书都有介绍。Sk表示a1+a2+……ak,如果Sk是n的倍数,那就直接取Sk了,否则S1-Sn除n的余数分布在1---(n-1)这n-1个数中,运用鸽巢原理,必然有两个的余数相同,即(Si%n)=(Sj%n),即(Sj-Si)%n=0,证毕
static int record[];
static void print(int start,int end)
{
System.out.println(end-start+1);
for(int i=start;i<=end;i++)
{
System.out.println(record[i]);
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext())
{
int n=scanner.nextInt();
record=new int[n+1];
int sum[]=new int[n+1];
int flag[]=new int[n+1];
for(int i=1;i<=n;i++)
{
record[i]=scanner.nextInt();
sum[i]=(sum[i-1]+record[i])%n;
}
for(int i=1;i<=n;i++)
{
if(sum[i]==0)
{
print(1, i);
break;
}
else if(flag[sum[i]]!=0){
print(flag[sum[i]]+1, i);
break;
}
else {
flag[sum[i]]=i;
}
}
}
}
}
poj 3370 http://poj.org/problem?id=3370 开挂可过
import java.io.BufferedInputStream;
import java.io.IOException;
public class Main {
//抽屉原理(鸽巢原理)最基础的原理便是n+1的物体放到n个盒子里,至少有一个盒子放了两个物体
//有n个数,从中选出几个数的和是n的倍数。
//结论是任意的n个数,必然能找到连续的m个数之和是n的倍数。
//组合数学书中,黑书都有介绍。Sk表示a1+a2+……ak,如果Sk是n的倍数,那就直接取Sk了,否则S1-Sn除n的余数分布在1---(n-1)这n-1个数中,运用鸽巢原理,必然有两个的余数相同,即(Si%n)=(Sj%n),即(Sj-Si)%n=0,证毕
public static BufferedInputStream bis = new BufferedInputStream(System.in);
public static int read() throws IOException {
int i;
while ((i = bis.read()) < 48)
if (i == -1)
return -1;
int temp = 0;
while (i > 47) {
temp = temp * 10 + i - 48;
i = bis.read();
}
return temp;
}
static void print(int start,int end)
{
for(int i=start;i<end;i++)
{
System.out.print(i+" ");
}
System.out.println(end);
}
public static void main(String[] args) throws IOException {
while(true)
{
int m=read();int n=read();
if(n==0&&m==0)break;
int record[]=new int[n+1];
int sum[]=new int[n+1];
int flag[]=new int[n+1];
for(int i=1;i<=n;i++)
{
record[i]=read();
}
for(int i=1;i<=n;i++)
{
sum[i]=(sum[i-1]+record[i])%m;
if(sum[i]==0)
{
print(1, i);
break;
}
if(flag[sum[i]]!=0){
print(flag[sum[i]]+1, i);
break;
}
flag[sum[i]]=i;
}
}
}
}