C - Aladdin and the Flying Carpet(数论结论+思维)

这道题应该是我的反思题在这里插入图片描述
千万自己要注意,如果一个数n没有被完全分解,答案千万要记得ans*=2因为还有一个比1e6更大的素数存在作为他的因子!!
我明明找到了a的约数个数/2-a在b一下的约数个数==答案;
但是没看到题是不能是正方形wa惨了,为什么会有这个答案?其实多找几组就可以看出来,其实就是约数是对称的。
在这里插入图片描述
注意这里题上说b可能为边长,所以必须是从【1,b)中的a的约数个数!!!

#include<map>
#include<list>
#include<ctime>
#include<queue>
#include<deque>
#include<cmath>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include<sstream>
#include<fstream>
#include <iostream>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//ll gcd(ll a,ll b){
//   return b?gcd(b,a%b):a;
//}
//ll QP(ll x,ll n,ll Mod){
//     ll res=1;
//     while(n){
//       if(n&1){
//         res=(res*x)%Mod;
//       }
//       x=(x*x)%Mod;
//       n>>=1;
//     }
//       return res;
//}
//素数筛选
const int N = 1e6 + 10;
int pri[600010], k;//k记录素数的个数,这里的素数是从下标为0开始的
bool Isprime[N];
void prime()
{
    k = 0;
    memset(Isprime, true, sizeof(Isprime));
    Isprime[1] = false;
    for(int i = 2 ; i < N ; i++)
    {
        if(Isprime[i])
        {
            pri[k++] = i;
            for(int j = 2 ; i * j < N ;j++)
                Isprime[i * j] = false;
        }
    }
}
int main(){
       prime();
      ll n,a,b,g=1,cnt1,cnt2,ans1,ans;
      scanf("%lld",&n);
      while(n--){
      	  scanf("%lld %lld",&a,&b);
      	  ll t=a;
      	  if(b*b>=a){
      	  	printf("Case %lld: %lld\n",g++,0);
      	  	continue;
			}
      	  //求a的约数和b的约数个数
		ans1=1;
		for(int i=0;i<k&&pri[i]*pri[i]<=a;i++){
			   cnt1=0;
			   while(a%pri[i]==0){
			   	     a/=pri[i];
			   	     cnt1++;
			   }
			   ans1*=(cnt1+1);
		} 
		if(a>1) ans1*=2;
		cnt2=0;
		for(int i=1;i<b;i++){//因为题上说b可能是最小边长,而不是确定了的,所以这里需要找b一下的a的约数 
			  if(t%i==0) cnt2++;
		}
		 ans=ans1/2-cnt2;
		printf("Case %lld: %lld\n",g++,ans);
	  }
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值