Codeforces101061G(Repeat it-规律+逆
2019-07-24 本文已影响0人
雨落八千里

Repeat it
题意:
- 给一个m,n;m是复制的次数,n是复制的数,问n复制m次模上1e9+7的数是多少?
思路:
- 当你复制一次就会多一个原来的数,刚好是两次复制数字的和
;
因为第一次的数往左移动了两位(根据原数确定)就可以发现是一个等比数列的前M项和。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1000000007;
int n,m;
ll powp(int a,int n)
{
ll ans=1;
ll base=a;
while(n)
{
if(n&1)
{
ans=ans%mod*base%mod;
}
base=base%mod*base%mod;
n>>=1;
}
return ans%mod;
}
ll len(int n)
{
int len=0;
while(n)
{
++len;
n/=10;
}
return len;
}
int main( )
{
int t;
ll a,b,q;
cin>>t;
while(t--)
{
cin>>m>>n;
int l=len(n);
//cout<<l<<" l "<<endl;
q=powp(10,l);
//cout<<q<<" q "<<endl;
a=powp(q,m);
//cout<<a<<" a "<<endl;
a=n*(a-1)%mod;
//cout<<a<<" a "<<endl;
b=powp(q-1,mod-2);
cout<<a%mod*b%mod<<endl;
}
return 0;
}