#include // #pragma GCC optimize("Ofast") // #pragma GCC optimize("unroll-loops") #define int long long #define ld long double #define vec vector #define all(m) (m).begin(), (m).end() #define forn(i,n) for(int i=0;i<(n);i++) // TIP To Run code, press or click the icon in the gutter. using namespace std; int mod = 1e9+7; void add(int &a, int b) { a += b; while (a<0) a += mod; while (a>=mod) a -= mod; } void solve() { int n,p; cin>>n>>p; vec>> dp(n+1,vec>(p, vec(2))); vec ost_ten(n+1, 1); forn(i, n+1) { if (i == 0) { continue; } ost_ten[i] = (ost_ten[i-1] * 10) % p; } dp[0][0][0] = 1; //dp[0][0][1] = 1; dp[1][0][1] = 1; for (int d=1;d < 10ll;d++) { dp[1][d % p][0] += 1; } for (int len=2;len<=n;len++) { forn(r,p) { int k = len / 2; // if (len%2) { // forn(mid, 10) { // int new_r = 0; // //int new_r = (r + mid * ost_ten[k] + ost_ten[k + 1] * ((ost_ten[k] - r) % p)) % p; // add(new_r, r % p); // add(new_r, (mid * ost_ten[k]) % p); // add(new_r, (ost_ten[k + 1] * (ost_ten[k] + p - r))% p); // new_r %= p; // add(dp[len][new_r], dp[k][r]); // } // } forn(notmid, 10) { int new_r = (r * 10 + notmid + notmid * ost_ten[len-1]) % p; if (notmid == 0) { add(dp[len][new_r][1], dp[len-2][r][0]); add(dp[len][new_r][1], dp[len-2][r][1]); } else { add(dp[len][new_r][0], dp[len-2][r][0]); add(dp[len][new_r][0], dp[len-2][r][1]); } //add(dp[len][new_r],dp[len-2][r]); } // for (int d=2;d<20;d+=2) { // add(dp[len][r],dp[len-2][(r+p-d)%p]); // } // if (len%2) { // forn(d,10) { // add(dp[len][r],dp[len-1][(r+p-d)%p]); // } // } } } int ans = 1; for (int i=1;i<=n;i++) { add(ans,dp[i][0][0]); } cout<>tt; while (tt--) solve(); return 0; }