The Super Powers 数论+枚举

题目链接

题意:判断一个数能否写成至少两种指数形式,例如:64=2^9=8^2 题目要求把【1,2^64-1】之间所有符合条件的数输出。

解法:由分析得,若一个数的指数为合数,那么这个数一定符合题目条件,设X=a^{i*j},则X=(a^i)^j=(a^j)^i

因为在【1,2^64-1】范围内,合法指数最大为63,最小为4

那么我们可以枚举指数合数,然后再枚举底数a

考虑到unsigned long long 溢出问题,可通过换底公式取log ,求出底数a最大的指数ti

将所有合法数放入set,在输出即可

#include
#define ll unsigned long long
using namespace std;

const int N=105;
bool mark[N];
int prim[N];
int a[100];
int hh=0;
int cnt;
void initial()
{
    cnt=0;
    for (int i=2 ; i v;
		v.insert(1);
	for(ll i=2;i<(1ll<<16);i++)
	{	
		int ti=ceil(64 * log(2)/log(i))-1;
		ll now=i*i*i*i;
		v.insert(now);
		for (int j = 1; a[j] <= ti; j++)
		{
			now *= (a[j] - a[j-1] == 1 ? i : i * i);
			v.insert (now);
		}		
	}

	for(set::iterator T=v.begin();T!=v.end();T++)
	{
		printf("%llu\n",*T);
	}
	
}

 

你可能感兴趣的:(The Super Powers 数论+枚举)