今天打比赛的时候一直超时,赛后才发现我写的唯一分解定理是错的,下面展示出正确的唯一分解定理写法:

for(ll i=2; i*i<=n; i++)

    {

        if(n==1)

        {

            break;

        }

        if(n%i==0)

        {

            cnt++;

            a[cnt]=i;

            while(1)

            {

                if(n%i==0)

                {

                    n/=i;

                }

                else

                {

                    break;

                }

            }

        }

    }

if(n > 1) a[++cnt] = n;

被加粗的是我写错的地方,一是我写成i<=n,为什么会超时,因为找到n太大了,若n为2*1e9+7就会超时,为什么上面那个写法是正确的,因为它只找到了 i*i<=n,但是这样不会漏吗,比如n为949777*949777,就会漏,但是下面加了一个判断,if(n > 1) a[++cnt] = n,最后一个必为质数,这 是可以被证出来的。