LightOJ1236 Pairs Forming LCM (Teorema de decomposição único)

Link do tópico

Título

Use um método mais eficiente para calcular o resultado do programa mostrado na figura, exigindo i <= j e LCM (i, j) = n, encontre o logaritmo que satisfaça a condição.

Ideias

De acordo com lcm (a, b) = p1 ^ max (a1, b1) × p2 ^ max (a2, b2) ×… × pn ^ max (an, bn), podemos saber que quando ai = ei, bi pode levar [0, ei] Qualquer número no intervalo, o mesmo é verdadeiro quando bi = ei, há 2 * (ei + 1) tipos de resultados. Mas quando os três são iguais, haverá duplicação, por isso precisa ser subtraído. Em todos os casos restantes, exceto em (n, n), os outros aparecem duas vezes, portanto, adicione um e divida por dois para obter o resultado.

Código

#include<map>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int P=139;
const int mod=998244353;
const int maxn=1e7+5;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
bool vis[maxn];
ll n;
int t,ans,cnt,prime[1000005];
void eul(ll n)
{
    
    
	cnt=0;
	for(ll i=2;i<=n;i++)
	{
    
    
		if(!vis[i])
			prime[++cnt]=i;
		for(ll j=1;j<=cnt&&i*prime[j]<=n;j++)
		{
    
    
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)
				break;
		}
	}
}
int main()
{
    
    
	eul(maxn);
    scanf("%d",&t);
    for(int ca=1;ca<=t;ca++)
    {
    
    
    	ans=1;
    	scanf("%lld",&n);
    	for(int i=1;i<=cnt&&prime[i]*prime[i]<=n;i++)
    	{
    
    
    		if(n%prime[i]==0)
    		{
    
    
    			int tmp=0;
    			while(n%prime[i]==0)
    			{
    
    
    				n/=prime[i];
    				tmp++;
				}
				ans*=(2*tmp+1);
			}
		}
		if(n>1)
			ans*=(2*1+1);
		printf("Case %d: %d\n",ca,(ans+1)/2);
	}
    return 0;
}

Acho que você gosta

Origin blog.csdn.net/WTMDNM_/article/details/108725924
Recomendado
Clasificación