import java.util.*;
public class Euler662 {
    public static String solve() {
        int MOD=1000000007,w=10000,h=10000;
        int maxLen=(int)Math.sqrt((double)w*w+(double)h*h);
        List<Integer> fibs=new ArrayList<>();fibs.add(1);fibs.add(2);
        while(true){int nxt=fibs.get(fibs.size()-1)+fibs.get(fibs.size()-2);if(nxt>maxLen)break;fibs.add(nxt);}
        List<Integer> vertical=new ArrayList<>();List<int[]> other=new ArrayList<>();Set<Long> seen=new HashSet<>();
        for(int f:fibs){long fsq=(long)f*f;for(int x=0;x<=Math.min(f,w);x++){long y2=fsq-(long)x*x;if(y2<0)continue;
            int y=(int)Math.sqrt(y2);if((long)y*y!=y2||y>h)continue;if(x==0&&y==0)continue;
            long key=(long)x*100001+y;if(seen.add(key)){if(x==0)vertical.add(y);else other.add(new int[]{x,y});}}}
        Collections.sort(vertical);other.sort(Comparator.comparingInt(a->a[0]));
        int maxDx=0;for(int[] o:other)maxDx=Math.max(maxDx,o[0]);
        int ring=maxDx+1,rl=h+1;long[][] rows=new long[ring][rl];
        for(int x=0;x<=w;x++){long[] acc=new long[rl];long[] cur=rows[x%ring];Arrays.fill(cur,0);
            for(int[] o:other){if(o[0]>x)break;long[] src=rows[(x-o[0])%ring];
                for(int y=o[1];y<=h;y++)acc[y]=(acc[y]+src[y-o[1]])%MOD;}
            for(int y=0;y<=h;y++){long val=acc[y];if(x==0&&y==0)val=(val+1)%MOD;
                for(int dy:vertical){if(dy>y)break;val=(val+cur[y-dy])%MOD;}cur[y]=val;}}
        return String.valueOf(rows[w%ring][h]);}
    public static void main(String[] args){System.out.println(solve());}
}
