[CFGym101061G] Repeat it(逆元)

时间:2023-03-09 21:24:22
[CFGym101061G] Repeat it(逆元)

题目链接: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求的逆元,群里有巨巨直接用快速幂把逆元搞出来了,暂时还不太明白原理。

 /*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
//#include <unordered_map>
using namespace std;
#define fr first
#define sc second
#define cl clear
#define BUG puts("here!!!")
#define W(a) while(a--)
#define pb(a) push_back(a)
#define Rint(a) scanf("%d", &a)
#define Rll(a) scanf("%I64d", &a)
#define Rs(a) scanf("%s", a)
#define Cin(a) cin >> a
#define FRead() freopen("in", "r", stdin)
#define FWrite() freopen("out", "w", stdout)
#define Rep(i, len) for(int i = 0; i < (len); i++)
#define For(i, a, len) for(int i = (a); i < (len); i++)
#define Cls(a) memset((a), 0, sizeof(a))
#define Clr(a, x) memset((a), (x), sizeof(a))
#define Full(a) memset((a), 0x7f7f7f, sizeof(a))
#define lrt rt << 1
#define rrt rt << 1 | 1
#define pi 3.14159265359
#define RT return
#define lowbit(x) x & (-x)
#define onenum(x) __builtin_popcount(x)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef pair<string, int> psi;
typedef pair<LL, LL> pll;
typedef map<string, int> msi;
typedef vector<int> vi;
typedef vector<LL> vl;
typedef vector<vl> vvl;
typedef vector<bool> vb; const LL mod = ;
LL n, m;
LL len; LL quickmul(LL x, LL q) {
LL ret = ;
while(q) {
if(q & ) ret = (ret * x) % mod;
x = (x * x) % mod;
q >>= ;
}
return ret;
} LL exgcd(LL a, LL b, LL &x, LL &y) {
if(b == ) {
x = ;
y = ;
return a;
}
else {
LL ret = exgcd(b, a%b, x, y);
LL tmp = x;
x = y;
y = tmp - a / b * y;
return ret;
}
} LL mod_inverse(LL a, LL m) {
LL x, y;
exgcd(a, m, x, y);
return (x % m + m) % m;
} int main() {
// FRead();
int T;
Rint(T);
W(T) {
cin >> m >> n;
len = ;
LL tmp = n;
while(tmp) {
len++;
tmp /= ;
}
LL k = m * len;
if(n == ) len = ;
cout << (n*(quickmul(,1LL*len*m)-)%mod*mod_inverse(quickmul(,len)-,mod))%mod << endl;
}
RT ;
}