#include <iostream>
using namespace std;
const int MOD =1000000007;
long long price(long long base,long long exp)
{
long long a=1;
while(exp!=0)
{
if(exp%2==1) a=(a*base)%MOD;
base=(base*base)%MOD;
exp/=2;
}
return a;
}//快速幂算法可将算法的时间复杂度降低为O(lgn)
void solve()
{
long long n,m,ans=0;
cin>>n>>m;
if(n>=m)
{
ans=(m*2)%MOD;
}
else
{
long long p=m/n;//所必须的最小重量是多少
long long q=m%n;//余数代表所需要的比最小重量重1的个数
ans=(price(2,p)*(n-q)+price(2,p+1)*q)%MOD;
}
cout<<ans<<endl;
}
int main()
{
int T;
cin>>T;
while(T--) solve();
return 0;
}
这道题有2点非常重要
1.使用快速幂算法降低时间复杂度
2.最低价格的计算(把题目给的例子列举观察即可发现规律,我给到的算法就没有使用贪心策略而是数学规律)

京公网安备 11010502036488号