質問の意味:数Lを与え、少なくともL.の正の整数倍を形成するために一緒に接続されているどのように多くの8尋ねます
考え:8 Xは正の整数で8 *(10 ^ X-1)/ 9のように表すことができます。次いで満たすL | 8 *(10 ^ X-1)/ 9。10 ^ X = 1(mod9 *のL / D)が、D = GCDに相当する(1,8)。
だから我々はちょうどあなたが満たすことができるかどうかを確認し、ライン上の[9 *のL / D]についてのファイの数を列挙する必要があります。その数は満足の行く答えについてです。但し、その10 9 * L / D互いに素と。
#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <ベクトル> の#include <地図> の#include <キュー> の#include <cmath> の#define LL長い長い 使用して 名前空間STD。 LLのn; [F LL 100010 ]。 LLのGCD(-1,11,11- b)は { 戻り B GCD(B、%の?B)。 } のLL eler(LLのM) { LL RES = M。 以下のために(LL I = 2 ; iは、* I <= M; iは++ ) { 場合(M%のI == 0 ) RESの =のRES / iが(I-* 1 )。 一方、(M%のI == 0 ) 、M / = I。 } であれば(M> 1 ) のRES = RES / M×(M- 1 )。 リターンのres; } ボイド検索(LLのX) { LL S =のX。 F [ 0 ] = 0 ; 用(LL I = 2 ; iは= Sを<* iが++ ) 場合(!(のx%のI)) { [F ++ F [ 0 ] = I。 しばらく((のx%の!I)) のx / = I; } 場合(X> 1 ) [F ++ F [ 0 ] =のX。 } ブールチェック(LLのX、LL MOD) { LL RES = 1 。 LL H = 10 。 一方、(X) { 場合(X&1 ) RESの%=(RES * H)MOD。 H =(H * H)%のMOD。 X >> = 1 。 } 戻り(RESの%のMOD)== 1; } int型のmain() { int型のk = 0 。 一方、(〜のscanf(" %のLLD "、&N)) { 場合(N == 0 ) ブレーク。 LLのD = GCD(N、8LL)。 LLのM = eler(9 * N / D)。 LL P = 9 * N / D。 もし(!GCD(P、10ll)= 1 ){ のprintf(" ケース%D:%LLDする\ n "、++ K、0LL)。 持続する; } (M)を見つけます。 // のprintf( "M:%LLDする\ n"、M)。 // printfの( "P:%LLDの\ nを"、p)は、 用(LL I = 1 ; I <= [F 0 ]; iは++ ) { // のprintf( "F:%Dを\ n"、F [I])。 一方、(1 ) { M / = [I] F。 もし(!チェック(M、P)) { M * = F [i]は、 破ります; } 他 { 場合(M%F [I]) { 破ります。 } } } } のprintf(" ケース%のD:%LLDする\ n "、++ K、M)。 } }