cf144A题解
本题思路:
没有式子,就创造式子!
可以将p分解因数为:
\[x1^{a1} * x2^{a2} * x3^{a3} ……
\]
将q分解为:
\[y1^{b1} * y2^{b2} * y3^{b3}……
\]
那么x的因数分解就很明显了,x应该是:
\[i为1-n的任意数
\]
\[x1^{a1} * x2^{a2} * x3^{a3} ……xi^{bi-1}……
\]
中的max
举个栗子
p=30,q=15
\[p=2^1 * 3^1 * 5^1
\]
\[q=3^1 * 5^1
\]
备选的方案有:
\[1. 2^1*5^1
\]
\[2. 2^3*5^1
\]
\[PS:不会有人认为会有2^{-1} * 3^1 * 5*1 的解吧
\]
题解到此结束
调TLE
代码提交上去之后狂T不止,题解甚至只用了2,3ms。
噔噔棱噔噔!
调查:当代码TLE时,你会优先:
(以上是LEWISAK的优先级)
那么各个方法的效果如何呢?
- 卡常!
 效果:搬上了祖传的火车头也无济于事
- 看题解!
 效果:码风都改的完全一样了还是T
- 查看死循环!
 效果:调了1h+
- 给自己造各种hack!
 效果:当啥都是hack时,hack将毫无意义:)
- 变身草履虫!
 效果绝佳!
猜猜是为啥?
while(y--){
        ...
}
在我的代码中,远远比:
for(int i=1;i<=y;i++){
        ...
}
慢!
ACcode:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,q,p;
int get(int x,int y){
	int ttt=0;
	while(!(x%y)){
		ttt++;
		x/=y;
	}
	return ttt;
}
int pw(int x,int y){
	int ttt=1;
	for(int i=1;i<=y;i++){
		ttt*=x;
	}
	return ttt;
}
signed main(){
	cin>>t;
	while(t--){
		int ans=1;
		cin>>q>>p;
		for(int i=2;i<=sqrt(p);i++){
			if(!(p%i)){
				ans=max(ans,(int)(q/pw(i,get(q,i)-get(p,i)+1)));
				while(!(p%i)){
					p/=i;
				}
			}
		}
		if(p>1){
			ans=max(ans,(int)(q/pw(p,get(q,p)-get(p,p)+1)));
		}
		cout<<ans<<endl;
	}
}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号