题意:对数p开n次方,求所得结果k。
要求:1<=n<= 200, 1<=p<10101,1<=k<=109。
想法:一开始我想了想觉得数据好大呀!!!如果10^101开2次方这个好难呀!!!单纯的我开了一个1000000的数组,打算先把一开始的质数全部找出来。。于是写了如下代码。。。
void getprime() {
prime[0] = 2, prime[1] = 3, prime[2] = 5;
ll temp = 7;
int flag,flagg,i,j,yu;
for (i = 3; i < 25000; ++temp) {
flag = 1,flagg=0;
yu = temp % 10;
if (yu == 1 || yu == 3 || yu == 7 || yu == 9){
flagg = 1;
for (j = 0; prime[j] <= sqrt(temp) && j < i; ++j)
if (!(temp%prime[j])) { flag = 0; break; }
}
if (flag&&flagg) {
prime[i] = temp;
++i;
}
}
}
嗯。。只能找到25000才符合1000ms的要求嘛。。
于是我接下来这么做了~
<pre class="html" name="code">int main() {
getprime();
ll n, p;
while (cin >> n >> p) {
cout << n << " " << p;
ll res = 1;
int i = 0;
while (p != 1) {
while (!(p%prime[i])) {
res *= prime[i];
p = p / (pow(prime[i], n));
}
++i;
}
cout << res << endl;
}
return 0;
}
我得意洋洋,开开心心的打算跑数据,此时我内心是这样的~hiahiahia 小case!!!
结果。。“7 4357186184021382204544”这组数据。。long long完全没办法hold的好吗!!!
我当时觉得自己傻逼了,这个数据还是10^101!!!高精度吗!!!难道!!!不是说好的贪心吗!!啊!!!!!
于是我打算去discuss去找思路啦啦啦啦~~
嗯。。。然后。。。
我看到了这个问题的code。。。如下。。。
int main() {
double n, m;
while (scanf("%lf%lf", &n, &m) == 2) printf("%.0lf\n", pow(m, 1 / n));
return 0;
}
这是在逗我吗?
好了。。。认真一点。。
这个代码确实能AC。然而需要进一步了解的就是pow函数是实现的。以及这个题除了这个解法以外,还有没有其他的不那么水的code。
这里留个思路,因为p肯定可以开n次方,故可以从对k的猜测入手,对k从高位一直猜测到低位。
比如对于四位的k,猜测k的最高位为x1,于是比较(x1*1000)^n、((x1+1)*1000)^n与p的关系,从而确定x1。思路大概这样,但是这样还是会用到pow。。但是也可以不用pow自己写个pow。。。但是这也没有什么用。。。
今天就到这里,下次见。