大家好,欢迎来到IT知识分享网。
循环节的定义
如果无限小数的小数点后,从某一位起向右进行到某一位止的一节数字循环出现,首尾衔接,称这种小数为循环小数,这一节数字称为循环节。
研究背景
给定一个整数 n n n,求最小的 k k k使 1 0 k ≡ 1 10^k≡1 10k≡1 ( m o d mod mod n n n)。此时的 k k k就等价于 1 n \frac{1}{n} n1的循环节的长度。
引理:对于 a k ≡ 1 a^k≡1 ak≡1 ( m o d mod mod n n n),若 a a a与 n n n互质,那么最小的 k k k必定是 ϕ ( n ) \phi(n) ϕ(n)的约数;若 a a a与 n n n有公因子,显然无解。
根据这个性质,只要枚举 ϕ ( n ) \phi(n) ϕ(n)的每个约数分别验证,就能求出循环节的最小长度 k k k了。
例题:Big Integer
链接
2019牛客暑期多校训练营(第三场)D题
题意
给定 n , m , p n,m,p n,m,p。 A ( a , b ) A(a,b) A(a,b)表示一个由 a b a^b ab个 1 1 1组成的数。
求有多少对 ( i , j ) (i,j) (i,j),满足 1 ≤ i ≤ n 1≤i≤n 1≤i≤n, 1 ≤ j ≤ m 1≤j≤m 1≤j≤m,使得 A ( i , j ) ≡ 0 ( m o d A(i,j)≡0(mod A(i,j)≡0(mod p ) p) p)。
( p , n , m ≤ 1 0 9 ) (p,n,m≤10^9) (p,n,m≤109)
分析
11…111 = 1 0 n − 1 9 \frac{10^n-1}{9} 910n−1 ≡ 0 (mod p)
等价于 1 0 n ≡ 1 10^n≡1 10n≡1 ( m o d (mod (mod 9 p ) 9p) 9p)
当 n ≠ 2 , 5 n≠2,5 n̸=2,5的倍数的时候,有 g c d ( 10 , 9 p ) = 1 gcd(10,9p)=1 gcd(10,9p)=1,因此 1 0 ϕ ( 9 p ) ≡ 1 10^{\phi(9p)}≡1 10ϕ(9p)≡1 ( m o d (mod (mod 9 p ) 9p) 9p)
我们需要找到满足 1 0 i 10^i 10i m o d mod mod 9 p 9p 9p的最小循环节长度 d d d。
根据前面说到的性质, d d d必定是 ϕ ( 9 p ) \phi(9p) ϕ(9p)的约数,
暴力枚举 ϕ ( 9 p ) \phi(9p) ϕ(9p)的约数分别验证就能找到最小循环节 d d d。
由于 d d d的倍数都可能作为循环节,所以接下来我们要找到有多少对 ( i , j ) (i,j) (i,j),满足 d d d | i j i^j ij。
将 d d d进行质因子分解,得到 d = p 1 k 1 p 2 k 2 . . . p x k x d=p_1^{k1}p_2^{k2}…p_x^{kx} d=p1k1p2k2...pxkx,
考虑当 j j j固定时, i i i必须是 g = p 1 ⌈ k 1 j ⌉ p 2 ⌈ k 2 j ⌉ . . . p x ⌈ k x j ⌉ g=p_1^{⌈\frac{k1}{j}⌉}p_2^{⌈\frac{k2}{j}⌉}…p_x^{⌈\frac{kx}{j}⌉} g=p1⌈jk1⌉p2⌈jk2⌉...px⌈jkx⌉的倍数。
因此一共有 n g \frac{n}{g} gn个合法的 i i i。
由于所有 k i ≤ 30 k_i≤30 ki≤30,所以当 j ≥ 30 j≥30 j≥30时, ⌈ k i j ⌉ = 1 ⌈\frac{ki}{j}⌉=1 ⌈jki⌉=1,
因此只需计算从 1 1 1到 30 30 30的 j j j的 g g g值即可。
当 p = 2 , 5 p=2,5 p=2,5的倍数时,显然答案为 0 0 0。
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; template<class T>inline void MAX(T &x,T y){
if(y>x)x=y;} template<class T>inline void MIN(T &x,T y){
if(y<x)x=y;} template<class T>inline void rd(T &x){
x=0;char o,f=1; while(o=getchar(),o<48)if(o==45)f=-f; do x=(x<<3)+(x<<1)+(o^48); while(o=getchar(),o>47); x*=f; } const int M=1e5+5; int cas,cnt[M],mark[M]; ll n,m,p,prime[M]; ll Fast(ll a,ll b,ll P){
ll res=0; while(b){
if(b&1)res=(res+a)%P; a=(a+a)%P; b>>=1; } return res; } ll fast(ll a,ll b,ll P){
ll res=1; while(b){
if(b&1)res=Fast(res,a,P); a=Fast(a,a,P); b>>=1; } return res; } int main(){
#ifndef ONLINE_JUDGE freopen("jiedai.in","r",stdin); // freopen("jiedai.out","w",stdout); #endif for(ll i=2;i<M;i++)if(!mark[i]) for(ll j=i*i;j<M;j+=i)mark[j]=1; rd(cas); while(cas--){
rd(p),rd(n),rd(m); if(p%2==0||p%5==0){
puts("0");continue;} ll P=9*p,phi=1,tmp=P; for(ll i=2;i*i<=P;i++){
if(!mark[i]){
int tp=1; while(tmp%i==0){
tmp/=i; if(tp)phi*=i-1,tp=0; else phi*=i; } } } if(tmp>1)phi*=tmp-1; ll d=phi,res=0,ans=0; for(ll i=1;i*i<=phi;i++) if(phi%i==0&&fast(10,i,P)==1) {
MIN(d,i);break;} for(ll i=sqrt(phi);i;i--) if(phi%i==0&&fast(10,phi/i,P)==1) {
MIN(d,phi/i);break;} tmp=d; for(ll i=2;i*i<=d;i++)if(!mark[i]&&d%i==0){
prime[++res]=i; cnt[res]=0; while(tmp%i==0)cnt[res]++,tmp/=i; } if(tmp>1)prime[++res]=tmp,cnt[res]=1; for(int j=1;j<=min(30ll,m);j++){
tmp=1; for(int i=1;i<=res;i++) for(int t=1;t<=(cnt[i]+j-1)/j;t++) tmp*=prime[i]; ans+=n/tmp; if(j==30)ans+=(n/tmp)*(m-30); } printf("%lld\n",ans); } return (0-0); }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/133316.html