[LightOJ-1341]

其实这个方法跟直接暴力(从n到sqrt(n))有区别?就硬出题
数据把sqrt(q)<<<<<<<<<n 所以原本数据均匀下相等的情况,效率一样的方法,在这里有了区别
性质:约数个数等于质因子次数+1的累成

const int N=1e6+5;
int pp[N];//标记用的 
ll p[N];//保存质数用的 
ll n,q;
ll k;
void init(){//把质数保存下来 
	k=0;
	memset(pp,0,sizeof pp);
	pp[0]=pp[1]=1;
	for(ll i=2;i<N;i++){
		if(!pp[i]){
			p[k++]=i;
			for(ll j=i*i;j<N;j+=i)
				pp[j]=1;
		}
	}
}
ll ppp(){//求质因数个数的模板 
	ll res=1;
	for(ll i=0;p[i]*p[i]<=n&&i<k;i++){
		ll cot=0;
		if(n%p[i]==0){
			while(n%p[i]==0){
				cot++;
				n/=p[i];
			}
			res*=(cot+1);
		}
	}
	if(n>1)res=res*2;
	return res;
}
int main()
{
	int t;
	int kk=1;
	cin>>t;
	init();//记得不要忘了。。。 
	while(t--){
		cin>>n>>q;
		ll nn=n;
		if(q*q>=n){//特判一下,不满足的话直接输出0 
			printf("Case %d: 0\n",kk++);
			continue;
		}
		else{
			ll ans=ppp();//求出有多少个因子 
			ans/=2;//因为是长方形,有一半是重复的所以要除以2,就算有n^(1/2),这个值,它也是不满足的(因为需要是长方形),所以除以2取整是对的。 
			for(ll i=1;i<q;i++){
				if(nn%i==0)ans--;//去掉最小边小于题目给的最小长度。 
			}
			printf("Case %d: %lld\n",kk++,ans);//输出结果 
		}
	}
	return 0;
}
发布了22 篇原创文章 · 获赞 2 · 访问量 375

猜你喜欢

转载自blog.csdn.net/qq_43543086/article/details/104648001