题目链接:http://codeforces.com/gym/101061/problem/G
题意:给一个数字n,让你重复m次,求最后这个数对1e9+7取模的结果。
思路:设数字n长度为k,重复m次即 Σ(i,0->m-1)pow(10, k*i)*n。化简公式得到最终结果为n*(pow(10,k*m)-1)/(pow(10,k)-1),要取模所以求一发分母的逆元然后乘进去就行了。我是用exgcd求的逆元,群里有巨巨直接用快速幂把逆元搞出来了,暂时还不太明白原理。
1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃ 15 ┻┻┻┻┻┻ 16 */ 17 #include <algorithm> 18 #include <iostream> 19 #include <iomanip> 20 #include <cstring> 21 #include <climits> 22 #include <complex> 23 #include <cassert> 24 #include <cstdio> 25 #include <bitset> 26 #include <vector> 27 #include <deque> 28 #include <queue> 29 #include <stack> 30 #include <ctime> 31 #include <set> 32 #include <map> 33 #include <cmath> 34 //#include <unordered_map> 35 using namespace std; 36 #define fr first 37 #define sc second 38 #define cl clear 39 #define BUG puts("here!!!") 40 #define W(a) while(a--) 41 #define pb(a) push_back(a) 42 #define Rint(a) scanf("%d", &a) 43 #define Rll(a) scanf("%I64d", &a) 44 #define Rs(a) scanf("%s", a) 45 #define Cin(a) cin >> a 46 #define FRead() freopen("in", "r", stdin) 47 #define FWrite() freopen("out", "w", stdout) 48 #define Rep(i, len) for(int i = 0; i < (len); i++) 49 #define For(i, a, len) for(int i = (a); i < (len); i++) 50 #define Cls(a) memset((a), 0, sizeof(a)) 51 #define Clr(a, x) memset((a), (x), sizeof(a)) 52 #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) 53 #define lrt rt << 1 54 #define rrt rt << 1 | 1 55 #define pi 3.14159265359 56 #define RT return 57 #define lowbit(x) x & (-x) 58 #define onenum(x) __builtin_popcount(x) 59 typedef long long LL; 60 typedef long double LD; 61 typedef unsigned long long ULL; 62 typedef pair<int, int> pii; 63 typedef pair<string, int> psi; 64 typedef pair<LL, LL> pll; 65 typedef map<string, int> msi; 66 typedef vector<int> vi; 67 typedef vector<LL> vl; 68 typedef vector<vl> vvl; 69 typedef vector<bool> vb; 70 71 const LL mod = 1000000007; 72 LL n, m; 73 LL len; 74 75 LL quickmul(LL x, LL q) { 76 LL ret = 1; 77 while(q) { 78 if(q & 1) ret = (ret * x) % mod; 79 x = (x * x) % mod; 80 q >>= 1; 81 } 82 return ret; 83 } 84 85 LL exgcd(LL a, LL b, LL &x, LL &y) { 86 if(b == 0) { 87 x = 1; 88 y = 0; 89 return a; 90 } 91 else { 92 LL ret = exgcd(b, a%b, x, y); 93 LL tmp = x; 94 x = y; 95 y = tmp - a / b * y; 96 return ret; 97 } 98 } 99 100 LL mod_inverse(LL a, LL m) { 101 LL x, y; 102 exgcd(a, m, x, y); 103 return (x % m + m) % m; 104 } 105 106 int main() { 107 // FRead(); 108 int T; 109 Rint(T); 110 W(T) { 111 cin >> m >> n; 112 len = 0; 113 LL tmp = n; 114 while(tmp) { 115 len++; 116 tmp /= 10; 117 } 118 LL k = m * len; 119 if(n == 0) len = 1; 120 cout << (n*(quickmul(10,1LL*len*m)-1)%mod*mod_inverse(quickmul(10,len)-1,mod))%mod << endl; 121 } 122 RT 0; 123 }