package contest180608; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.math.BigInteger; import java.util.Arrays; import java.util.InputMismatchException; public class D2 { InputStream is; PrintWriter out; String INPUT = ""; void solve() { int n = ni(), m = ni(); int[] xs = na(m); // 17×9920467×592951213 long[] divs = {17, 9920467, 592951213}; long[] mods = new long[3]; dp = new int[n/2+1]; for(int i = 0;i < 3;i++){ mods[i] = go((int)divs[i], xs, n); } out.println(crtx(divs, mods)); } int[] dp; long go(int mod, int[] xs, int n) { Arrays.fill(dp, 0); dp[0] = 1; for(int i = 1;i < n/2+1;i++){ for(int x : xs){ if(i-x >= 0){ dp[i] += dp[i-x]; if(dp[i] >= mod)dp[i] -= mod; } } } long ret = 0; for(int x : xs){ for(int i = 0;i < n/2+1;i++){ if(i+x >= n/2+1 && i+x < n){ ret += (long)dp[i] * dp[n-1-(i+x)]; ret %= mod; } } } return ret; } public static BigInteger b(long x){ return BigInteger.valueOf(x); } public static BigInteger[] exGCD(BigInteger a, BigInteger b) { BigInteger p = BigInteger.ONE, q = BigInteger.ZERO, r = BigInteger.ZERO, s = BigInteger.ONE; while(b.signum() > 0){ BigInteger c = a.divide(b); BigInteger d; d = a; a = b; b = d.mod(b); d = p; p = q; q = d.subtract(c.multiply(q)); d = r; r = s; s = d.subtract(c.multiply(s)); } return new BigInteger[]{a, p, r}; } public static BigInteger crtx(long[] divs, long[] mods) { BigInteger div = b(divs[0]), mod = b(mods[0]); for(int i = 1;i < divs.length;i++){ BigInteger[] apr = exGCD(div, b(divs[i])); BigInteger mm = b(mods[i]).subtract(mod); if(mm.mod(apr[0]).signum() != 0)return b(-1); BigInteger da = div.divide(apr[0]); BigInteger ndiv = b(divs[i]).multiply(da); BigInteger nmod = apr[1].multiply(mm).multiply(da).add(mod).mod(ndiv); if(nmod.signum() < 0)nmod = nmod.add(ndiv); div = ndiv; mod = nmod; } return mod; } void run() throws Exception { is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes()); out = new PrintWriter(System.out); long s = System.currentTimeMillis(); solve(); out.flush(); if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms"); // Thread t = new Thread(null, null, "~", Runtime.getRuntime().maxMemory()){ // @Override // public void run() { // long s = System.currentTimeMillis(); // solve(); // out.flush(); // if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms"); // } // }; // t.start(); // t.join(); } public static void main(String[] args) throws Exception { new D2().run(); } private byte[] inbuf = new byte[1024]; public int lenbuf = 0, ptrbuf = 0; private int readByte() { if(lenbuf == -1)throw new InputMismatchException(); if(ptrbuf >= lenbuf){ ptrbuf = 0; try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); } if(lenbuf <= 0)return -1; } return inbuf[ptrbuf++]; } private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); } private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; } private double nd() { return Double.parseDouble(ns()); } private char nc() { return (char)skip(); } private String ns() { int b = skip(); StringBuilder sb = new StringBuilder(); while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ') sb.appendCodePoint(b); b = readByte(); } return sb.toString(); } private char[] ns(int n) { char[] buf = new char[n]; int b = skip(), p = 0; while(p < n && !(isSpaceChar(b))){ buf[p++] = (char)b; b = readByte(); } return n == p ? buf : Arrays.copyOf(buf, p); } private int[] na(int n) { int[] a = new int[n]; for(int i = 0;i < n;i++)a[i] = ni(); return a; } private long[] nal(int n) { long[] a = new long[n]; for(int i = 0;i < n;i++)a[i] = nl(); return a; } private char[][] nm(int n, int m) { char[][] map = new char[n][]; for(int i = 0;i < n;i++)map[i] = ns(m); return map; } private int[][] nmi(int n, int m) { int[][] map = new int[n][]; for(int i = 0;i < n;i++)map[i] = na(m); return map; } private int ni() { return (int)nl(); } private long nl() { long num = 0; int b; boolean minus = false; while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')); if(b == '-'){ minus = true; b = readByte(); } while(true){ if(b >= '0' && b <= '9'){ num = num * 10 + (b - '0'); }else{ return minus ? -num : num; } b = readByte(); } } private static void tr(Object... o) { System.out.println(Arrays.deepToString(o)); } }