LightOJ1236 pares que forman LCM (teorema de descomposición único)

Enlace de tema

Título

Use un método más eficiente para calcular el resultado del programa que se muestra en la figura, requiriendo i <= j y LCM (i, j) = n, encuentre el logaritmo que satisface la condición.

Ideas

Según mcm (a, b) = p1 ^ max (a1, b1) × p2 ^ max (a2, b2) ×… × pn ^ max (an, bn), podemos saber que cuando ai = ei, bi se puede tomar como [0, ei] Cualquier número en el rango, lo mismo es cierto cuando bi = ei, hay 2 * (ei + 1) tipos de resultados. Pero cuando los tres son iguales, habrá duplicación, por lo que es necesario restarlo. En todos los casos restantes, excepto (n, n), los demás aparecen dos veces, así que sume uno y divida por dos para obtener el 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;
}

Supongo que te gusta

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