i
k
<
2
64
i^k < 2^{64}
ik<264
k
∗
l
o
g
(
i
)
<
64
∗
l
o
g
(
2
)
k*log(i) < 64 * log(2)
k∗log(i)<64∗log(2)
k
<
64
∗
l
o
g
(
2
)
/
l
o
g
(
i
)
k < 64 * log(2) /log(i)
k<64∗log(2)/log(i)
其中k是合数
只有k是合数
i
k
=
(
i
a
)
b
i^k = (i^a)^b
ik=(ia)b
a
∗
b
=
k
a*b = k
a∗b=k
参考代码
bool heshu[101];
void init(void)
{
for(int i = 2; i <= 100; ++i)
{
if(!heshu[i])
{
for(int j = i+i; j <= 100; j += i)
heshu[j] = true;
}
}
}//打合数表
const int Max = 65536;
int main(void)
{
std::ios::sync_with_stdio(false);
init();
set<ULL> se;
se.insert(1);//插入1
for(int i = 2; i < 65540; ++i)
{
int sign = floor(64*log(2)/log(i));
ULL cur = i;
for(int j = 2; j <= 64&&j <= sign; ++j)
{
cur *= i;
if(heshu[j])
se.insert(cur);
}
}
se.erase(0);
for(auto c: se)
{
cout<<c<<endl;
}
return 0;
}
第一次总结
1 数学题就是要用数学的方法来做,先想数学方法,后想code