链接:
https://www.nowcoder.com/acm/contest/122/F
阿汤同学最近刚学数论,他发现数论实在是太有趣了,于是他想让你也感受一下数论的乐趣。现在他给你一个正整数 N 和一个正整数 M,要求你用 N 对 M 进行取余操作,即 N % M,记余数为 S。
但是他发现这样好像并不能让你感受到数论的乐趣,于是他想让你在N 对 M 取余操作的基础上再求出这个余数 S 能分解出多少个不同质因数。
阿汤同学最近刚学数论,他发现数论实在是太有趣了,于是他想让你也感受一下数论的乐趣。现在他给你一个正整数 N 和一个正整数 M,要求你用 N 对 M 进行取余操作,即 N % M,记余数为 S。
但是他发现这样好像并不能让你感受到数论的乐趣,于是他想让你在N 对 M 取余操作的基础上再求出这个余数 S 能分解出多少个不同质因数。
质因数:质因数在数论里是指能整除给定正整数的质数,质数就是只能整除 1 和本身的数,定义 2 是最小的质数。
真的不错这道题;
考查了两个方面的知识:1、一个是用大数取余,(紫书上有写)
for( int i = 0 ; i<len ; i++) {
ans=(int)( (long long ) ans*10+n[i]-'0' );
}printf("%d\n",ans);
贴上 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000400;
int prime[maxn],x[maxn],cnt;
void is_prime(){
int t=0;
for(int i=2;i<=maxn;i++){
if(x[i]==0){
prime[t++]=i;
x[i]=1;
for(int j=i;j<=maxn;j+=i){
x[j]=2;
}
}
}
cnt=t;
}
int main()
{
is_prime();
char n[1000];
int m,T;
while(~scanf("%d",&T)){
while(T--){
scanf("%s",n);
scanf("%d",&m);
int len=strlen(n);
ll ans=0;
for(int i=0;i<len;i++){
ans=(int)(((ll)ans*10+n[i]-'0')%m);
}
int k=ans,tot=0,a[maxn],b[maxn];
//printf("%d\n",k);
for(int i=0;prime[i]*prime[i]<=k&&i<cnt;i++){
if(k%prime[i]==0){
a[++tot]=prime[i];
b[tot]=0;
while(k%prime[i]==0){
++b[tot];
k/=prime[i];
}
}
}
if(k!=1){
a[++tot]=k;
b[tot]=1;
}
printf("%d\n",tot);
}
}
return 0;
}