题解:CF1912D Divisibility Test

又是一道水绿。

刚刚小学毕业的数学 idiot——我释怀地笑了。

第一种很好判断,当 \(b^k\)\(n\) 的倍数时,取基数为 \(b\) 的能被 \(n\) 整除的整数 \(c\) 的最后 \(k\) 位数显然能被 \(n\) 整除。

第二种也不难,当 \(b^k \equiv 1 \pmod n\) 时,取以 \(b\) 为底数的能被 \(n\) 整除的整数 \(c\)\(k\) 位数的各组之和能被 \(n\) 整除。

为什么呢?

\(a_1,a_2,\dots,a_l\)\(c\) 从低位到高位各个 \(k\) 位数,则 \(c=\sum _ {i=1} ^ {l} a_i \times 10^{(i-1)k}\),而和 \(d\)\(\sum _ {i=1} ^ {l} a_i\)。∵\(10^{(i-1)k}\equiv 1 \pmod n\)。于是 \(c=\sum _ {i=1} ^ {l} a_i \times 10^{(i-1)k} \equiv \sum _ {i=1} ^ {l} a_i \times 1 \pmod n\)。∴\(c \equiv d \pmod n\)

第三种也很好判断,按第二种的方法,能推出式子。当 \(b^k \equiv -1 \pmod n\) 时,取以 \(b\) 为底数的能被 \(n\) 整除的整数 \(c\)\(k\) 位数的各组之和能被 \(n\) 整除。

\(a_1,a_2,\dots,a_l\)\(c\) 从低位到高位各个 \(k\) 位数,则 \(c=\sum _ {i=1} ^ {l} a_i \times 10^{(i-1)k}\),而和 \(d\)\(\sum _ {i=1} ^ {l} (-1)^i\times a_i\)。∵\(10^{(i-1)k}\equiv -1 \pmod n\)。于是 \(c=\sum _ {i=1} ^ {l} a_i \times 10^{(i-1)k} \equiv \sum _ {i=1} ^ {l} a_i \times (-1)^i \pmod n\)。∴\(c \equiv d \pmod n\)

My code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,b,n;
ll power;
int main(){
	cin>>t;
  	while(t--){
	    cin>>b>>n;
	    power=1; 
		bool f=0;
	    for(int k=1;k<=n&&!f;k++){
	    	power=power*b%n; 
	      	if(!power)cout<<"1 "<<k<<'\n',f=1;
	      	else if(power==1)cout<<"2 "<<k<<'\n',f=1;
	      	else if(power==n-1)cout<<"3 "<<k<<'\n',f=1;
	    }
	    if(!f) cout<<"0\n"; 
  }
  return 0;
}



posted @ 2024-07-23 12:16  OIer_Hhy  阅读(7)  评论(0编辑  收藏  举报