D-LCA On N-ary Tree(思维)
在画树时找到一个有趣的数学规律,适用于已知子节点找父节点。
比如:
father=x;(这里初始化)
father=(father+n-2)/n;
当n==2时,循环次数<30,因为 2^30 >10^9。当n>2时肯定小于30,所以肯定不会超时。但是当n==1时,如果用这种方法也能算出来,但是会超时,有更好的方法是直接特判。
代码如下:
#include<cstdio> using namespace std; bool ok=0; int main() { int t,n; scanf("%d",&t); int z,x,y; for(int i=1;i<=t;i++){ scanf("%d%d%d",&z,&x,&y); int fa=x,fb=y; if(z==1){ if(fa>fb)printf("%d\n",fb); else printf("%d\n",fa); } else{ while(1){ if(fa==fb){ if(fa==0){ printf("1\n"); } else printf("%d\n",fa); break; } else if(fa>fb){ fa=(fa+z-2)/z; } else if(fb>fa){ fb=(fb+z-2)/z; } } } } }