本文共 723 字,大约阅读时间需要 2 分钟。
数据限制:
1<=m<=n<=109 1<=k1<=k2<=109 0<=k2-k1<=105 加黑体部分说明了最大循环次数为105,因此可以用暴力求解,但必须先求出小数点后第k1位数字。 我们知道编程模拟一个除法竖式就是不断的将被除数m乘10,除以除数n,再取余r作为下一步操作对象,那么要求出k1位数字,本质上就是要求第k1-1步时的r,而r等同于m×10k1-1%n,于是,我们可以用快速幂快速求出10k1-1(过程取模n,结果不影响)得到x,r=(m×x)%n。 代码如下:#include#include #include #include typedef long long ll;using namespace std;ll quick_pow(ll x,ll y,ll mod){ ll ans=1; while(y) { if(y%2==1) { ans=(ans*x)%mod; y--; } else { y/=2; x=(x*x)%mod; } } return ans;}int main(){ int T; ll m,n,k1,k2,x; cin>>T; while(T--) { cin>>m>>n>>k1>>k2; x=quick_pow(10,k1-1,n); m=(m*x)%n; for(int i=k1;i<=k2;i++) { m*=10; cout<
Tips:做题要看清题目的限制,别看到109就被吓到,真正限制循环的是105。
转载地址:http://lbdci.baihongyu.com/