ARC111A Simple Maths 2

Simple Maths 2

题目传送门

如题目所说,这是一道简单数学题。

题目的意思就是求 ⌊ 1 0 n m ⌋ \lfloor\frac{10^n}{m}\rfloor m10n 除以 m m m 的余数。

我们看到向下取整的符号可以自然想到一个方法,我们有:

1 0 n = ⌊ 1 0 n m ⌋ × m + r 10^n=\lfloor\frac{10^n}{m}\rfloor\times m+r 10n=m10n×m+r

我们设 ⌊ 1 0 n m ⌋ = k \lfloor\frac{10^n}{m}\rfloor=k m10n=k,则有:

1 0 n = k × m + r 10^n=k\times m+r 10n=k×m+r
k = k ′ × m + r ′ k=k'\times m+r' k=k×m+r

r ′ r' r即为所求。

我们把 k k k 带入到第一个式子中,有:

1 0 n = ( k ′ × m + r ′ ) × m + r 10^n=(k'\times m+r')\times m+r 10n=(k×m+r)×m+r
1 0 n = k ′ × m 2 + r ′ × m + r 10^n=k'\times m^2+r'\times m+r 10n=k×m2+r×m+r

由余数的定义可得:

r ′ × m + r ≡ k    ( mod ⁡ m 2 ) r'\times m+r\equiv k \ \ (\operatorname{mod} m^2) r×m+rk  (modm2)
⌊ r ′ × m + r m ⌋ = r ′ \lfloor\frac{r'\times m+r}{m}\rfloor=r' mr×m+r=r

那么求解 r ′ r' r 的方法就明了了。时间复杂度 O ( log ⁡ m 2 ) O(\log m^2) O(logm2)

//Don't act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you'll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;

int read() {
	char ch=getchar();
	int f=1,x=0;
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}

int n,m;

int qpow(int x,int y) {
	int ret=1;
	while(y) {
		if(y&1) {
			ret=ret*x%(m*m);
		}
		x=x*x%(m*m);
		y>>=1;
	}
	return ret;
}

signed main() {
	cin>>n>>m;
	cout<<qpow(10,n)/m<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值