链接
求出a的所有约数个数num,因为不可能是sqrt(a)*sqrt(a) ==a ,则成积为a的数对为num/2 ,然后再减去短边长小于b的对数,num就是答案了
#include<bits/stdc++.h> #define ll long long using namespace std; ll a,b; int T; const int N=1e6+5; bool mark[N]; int prim[N]; int cnt; void initial() { cnt=0; for (int i=2 ; i<N ; ++i) { if (!mark[i]) prim[cnt++]=i; for (int j=0 ; j<cnt && i*prim[j]<N ; ++j) { mark[i*prim[j]]=1; if (!(i%prim[j])) break; } } } int main() { initial(); // printf("%d\n",cnt); scanf("%d",&T); int test=1; while(T--) { scanf("%lld%lld",&a,&b); ll aa=a; if(a<b*b) { printf("Case %d: 0\n", test++); continue; } ll num=1; ll num2=1; for(int i=0;i<cnt&&prim[i]<=sqrt(a);i++) { int hh=1; while(a%prim[i]==0) { a/=prim[i]; hh++; } num*=hh; } if(a>1) num*=2; num/=2; for(int i=1;i<b;i++)//1开始 { if(aa%i==0) { num--; } } printf("Case %d: %lld\n",test++,num) ; } }
Aladdin and the Flying Carpet (正约数个数)
最新推荐文章于 2020-08-19 21:20:04 发布