Problem:
Problem J: 多項式の解の個数

きたまさ君は大学でさまざまな変換について研究している。最近、きたまさ君が興味を持っている変換は次のようなものである。 N+1個の整数 a0, ..., aN を固定し、整数 z を入力とする。また P を素数とする。

t = ( aNzN + aN-1zN-1 + ... + a2z2 + a1z + a0 ) mod P

きたまさ君はこの変換によって t = 0 になってしまう z がいくつもあることに気がついた。 そこで、きたまさ君は友人でありスーパープログラマーでもあるあなたに、変換後に t = 0 になる z が 0〜P-1 にいくつあるかを計算してもらうことにした。

Input

入力は次の形式で与えられる。

N P
a0 a1 ... aN

入力の1行目には整数Nと素数Pがスペース文字で区切られて与えられる。これらは、問題文で与えられたとおりである。 0 ≤ N ≤ 100, 2 ≤ P ≤ 109 を満たす。

次の1行には a0〜aN がスペース文字で区切られて与えられる。これらは |ai| ≤ 109 を満たす整数である。また aN ≠ 0 である。

Output

変換後に0になるような z (0 ≤ z < P) の個数を出力せよ。

Notes on Test Cases

上記入力形式で複数のデータセットが与えられます。各データセットに対して上記出力形式で出力を行うプログラムを作成して下さい。

N, P がともに 0 のとき入力の終わりを示します。

Sample Input

2 3
1 2 1
2 3
1 2 6
0 0

Output for Sample Input

1
1

Solution in C# (judge verdict: Memory Limit Exceeded)

using System;

public class Test
{
	public static void Main()
	{
		while(true){
		  string[] str1 = Console.ReadLine().Split(' ');
		  int n = int.Parse(str1[0]); 
		  int p = int.Parse(str1[1]); 

		  if(n == 0) break;
		
		  string[] str2 = Console.ReadLine().Split(' ');
		  int[] a = Array.ConvertAll(str2, new Converter<string,int>(s => int.Parse(s)));
		  //Console.WriteLine("???????????? N = {0} P = {1} Ai = {2}", n, p, a);
		  Console.WriteLine(calc(n,p,a));
		
		
		}

	}

  
  public static int calc(int n,int p,int[] a) {
	  //int[] res = new int[p];
	  int cnt = 0;
	
	  int[] nzm = new int[p];
          int[] am = new int[p];
	  for(int i=0; i<=n; i++) am[i] = a[i]%p;	

	  for(int z=0; z<p; z++){
	    int nzflag = 0;
	    long sum = am[0];
	    nzm[0] = 1;
	    for(int i=1; i<=n; i++){
	      int nz;
	      if(nzflag == 0) {
	        nz = (int)(((long)nzm[i-1]*(long)z)%p);
	        nzm[i] = nz;
	        if(nz == 1) nzflag = i;
	      } else {
	        nz = nzm[i%nzflag];	
	      }
	    	
	    	
	      sum += am[i]*nz;
	    }
	//    res[z] = sum%p;
	    if(sum%p == 0) cnt++;
	  }
	  return cnt;
  }
}