标签:line 超过 入门 bit 最小 不能 描述 clu turn
标签:入门讲座题解 数论
/*
Problem
LightOJ - 1341
Status
Accepted
Time
359ms
Memory
6968kB
Length
1607
Lang
C++
Submitted
2019-11-25 21:51:33
RemoteRunId
1640797
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 50;
bool vis[MAXN];
int prime[MAXN], cnt = 0;
inline ll read() //快读,加快程序输入速度.
{
ll res = 0;
char ch;
ch = getchar();
while(!isdigit(ch))
ch = getchar();
while(isdigit(ch)){
res = (res << 3) + (res << 1) + ch - 48;
ch = getchar();
}
return res;
}
void get_prime() //欧拉筛,先找到sqrt(n)以内的质数,方便之后质因数分解.
{
vis[1] = 1;
for(int i = 2; i <= int(1e6 + 5); i ++){
if(!vis[i])
prime[++ cnt] = i;
for(int j = 1; j <= cnt && i * prime[j] <= int(1e6 + 5); j ++){
vis[i * prime[j]] = 1;
if(i % prime[j] == 0)
break;
}
}
return ;
}
int main()
{
get_prime();
int times, _case = 0;
scanf("%d", ×);
while(times --){
ll a, b, t;
ll ans = 1;
a = read(), b = read();
t = a;
if(b * b >= a){ //如果最小的因数都超过了sqrt(a),那么说明不存在符合条件的成对的因数了.
printf("Case %d: 0\n", ++_case);
continue;
}
for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= a; i ++){
if(a % prime[i] == 0){
int res = 0;
while(a % prime[i] == 0){
res ++;
a /= prime[i];
}
ans *= 1ll * (res + 1);
}
}
if(a > 1)
ans <<= 1;
ans >>= 1; //问有几对,两个因数算作一对.(如果是完全平方数的sqrt(a)因子,则不能算作一对.)
for(ll i = 1; i < b; i ++){
if(t % i == 0)
ans --;
}
printf("Case %d: %lld\n", ++ _case, ans);
}
return 0;
}
Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】(未完成)
标签:line 超过 入门 bit 最小 不能 描述 clu turn
原文地址:https://www.cnblogs.com/satchelpp/p/11941141.html