import java.util.Scanner;

public class Main {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
} import java.util.Scanner; Scanner java.util public class Main {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
} Main public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    } main {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc int d = sc.nextInt(); d sc.nextInt() sc.nextInt sc Integer[][] x = new Integer[n][d]; x new Integer[n][d] n d for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        } int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        } {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        } for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            } int j = 0; int j = 0; j 0 j < d j d j++ j++ j {
                x[i][j] = sc.nextInt();
            } {
                x[i][j] = sc.nextInt();
            } x[i][j] = sc.nextInt() x[i][j] x[i] x i j sc.nextInt() sc.nextInt sc int result = 0; result 0 for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        } int i = 0; int i = 0; i 0 i < n - 1 i n - 1 n 1 i++ i++ i {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        } {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        } for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            } int k = 0; int k = 0; k 0 k < n - 1 - i k n - 1 - i n - 1 - i n 1 i k++ k++ k {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            } {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            } int sumInRoot = 0; sumInRoot 0 for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                } int j = 0; int j = 0; j 0 j < d j d j++ j++ j {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                } {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                } int y = x[i][j]; y x[i][j] x[i] x i j int z = x[i + 1 + k][j]; z x[i + 1 + k][j] x[i + 1 + k] x i + 1 + k i + 1 + k i 1 k j sumInRoot += (y - z) * (y - z) sumInRoot (y - z) * (y - z) (y - z) y z (y - z) y z String coordinate = String.valueOf(Math.sqrt(sumInRoot)); coordinate String.valueOf(Math.sqrt(sumInRoot)) String.valueOf String Math.sqrt(sumInRoot) Math.sqrt Math sumInRoot int pointIndex = coordinate.indexOf("."); pointIndex coordinate.indexOf(".") coordinate.indexOf coordinate "." if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                } coordinate.length() - 2 == coordinate.substring(0, pointIndex).length() coordinate.length() - 2 coordinate.length() coordinate.length coordinate 2 coordinate.substring(0, pointIndex).length() coordinate.substring(0, pointIndex).length coordinate.substring(0, pointIndex) coordinate.substring coordinate 0 pointIndex {
                    result++;
                } result++ result System.out.println(result) System.out.println System.out System System.out result String args[] args public class Main {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
} public class Main {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
} Main
import java.util.Scanner;

public class Main {

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        Integer[][] x = new Integer[n][d];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < d; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        int result = 0;

        // リストのサイズ-1分繰り返す（最後のインデックスで比較対象がないため）
        for (int i = 0; i < n - 1; i++) {

            // 以降のインデックス全てを比較
            for (int k = 0; k < n - 1 - i; k++) {

                // ルートの中身の項を計算
                int sumInRoot = 0;
                for (int j = 0; j < d; j++) {
                    int y = x[i][j];
                    int z = x[i + 1 + k][j];
                    sumInRoot += (y - z) * (y - z);
                }

                // 座標xを求める
                String coordinate = String.valueOf(Math.sqrt(sumInRoot));

                // 整数判定
                int pointIndex = coordinate.indexOf(".");
                if (coordinate.length() - 2 == coordinate.substring(0, pointIndex).length()) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
}
