2019.9.15考试

Candy

2019.9.15考试_第1张图片
2019.9.15考试_第2张图片

  • 提示就告诉我们了,每一位上的数字在每一位都要轮一次,所有最终的和可以比表示为 s ∗ 11..111 s*11..111 s11..111的形式
  • 所以这个最小的质因子要么是 s s s的质因子,要么是 11..111 11..111 11..111的质因子,只考虑前半部分就可以得到 70 70 70
#include 
using namespace std;
#define maxn 500010

int len,sum=0;
char s[maxn];

void readda_() {
	scanf("%s",s);
	len=strlen(s);
	for(int i=0;i<len;++i) {
		sum+=(s[i]-'0');
	}
	for(int i=2; ;++i) {
		if(!(sum%i)) {
			printf("%d",i);
			return ;
		}
	} 
}

int main() {
	freopen("a.txt","r",stdin);
	readda_();
	return 0;
}
  • s s s的最小质因子为 x x x, 11..111 11..111 11..111的最小质因子为 y y y,若最小质因子在后半部分,则 y < x y<x y<x,且 y ∣ 11..111 y|11..111 y11..111,即 y ∣ ( ( 1 0 n − 1 ) / 9 ) y|((10^{n}-1)/9) y((10n1)/9) ⟺ ⟺ 9 ∗ y ∣ ( 1 0 n − 1 ) 9*y|(10^{n}-1) 9y(10n1) ⟺ ⟺ 1 0 n m o d    9 ∗ x = 1 10^{n}\mod{9*x}=1 10nmod9x=1,在快速幂求时计算答案就行了
#include 
using namespace std;
#define maxn 500010
#define maxm 5000010

int len,sum=0,v[maxm],prime[maxn];
char s[maxn];

inline void readda_() {
	scanf("%s",s);
	len=strlen(s);
	for(int i=0;i<len;++i) {
		sum+=(s[i]-'0');
	}
}

inline bool quick_pow(long long a,int b,long long mod) {
	long long ans=1;
	while(b) {
		if(b&1) {ans*=a;ans%=mod;}
		a*=a;a%=mod;b>>=1;
	} 
	ans%=mod;
	if(ans==1) return true;
	else return false;
}

inline bool pd_(int x) {
	if(!(sum%x)||quick_pow(10,len,9*x)) {printf("%d",x);return true;} 
	return false;
}

inline void work_() {
	int cnt=0;
	for(int i=2;i<=5000000;++i) {
		if(!v[i]) {
			v[i]=i;
			prime[++cnt]=i;
			if(pd_(i)) return ; 
		}
		for(int j=1;j<=cnt;++j) {
			if(prime[j]>v[i]||prime[j]*i>5000000) break;
			v[prime[j]*i]=prime[j];
		}
	}
}

int main() {
	freopen("a.txt","r",stdin);
	readda_();
	work_();
	return 0;
}

你可能感兴趣的:(2019.9.15考试)