【算法模板】算数基本定理

mac2026-01-13  10

#include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef long long ll; const int maxn=1e6+2; bool is[maxn]; int cnt =0; ll p[maxn], prim[maxn]; int k; void find_prim() { k = 0; for(ll i = 2; i <= maxn; i++) { if(!p[i]) { prim[k++] = i; for(ll j = i+i; j <= maxn; j+=i) { p[j] = 1; } } } } ll cont(ll a) { ll s = 1; if(a == 0) { return 0; } ll tt = 0; ll i = 0; while(prim[i] < a && i < k) { tt = 0; if(a%prim[i] == 0) { while(a%prim[i] == 0) { a/=prim[i]; tt++; } } s *= tt+1; i++; } if(a > 1) { s *= 1+1;//一次 } return s; } int main(void) { //freopen("e://对拍//data.txt","r",stdin); //freopen("e://对拍//WA.txt","w",stdout); find_prim(); //srand(time(NUll)); int T; ll x,y; scanf("%d",&T); int casee=1; while(T--) { scanf("%lld%lld",&x,&y); if(y*y>=x) {printf("Case %d: %lld\n", casee++, 0);continue;} ll sum=cont(x); ll ans=0; for(ll i=1;i<y;i++) { if(x%i==0) ans++; } printf("Case %d: %lld\n", casee++, sum/2 - ans); } }

 

最新回复(0)