1. 程式人生 > 實用技巧 >聯賽前第八階段總結

聯賽前第八階段總結

上午小測1

階段排名 3

離Ak最近的一次

木板

  • 設BE=x,CF=y,因為三角形ABE與三角形ECF相似,得出式子

\[\frac{N}{N-x}=\frac{x}{y} \]

  • 得到y的式子

\[y=\frac{x(N-x)}{N}=x-\frac{x^2}{N} \]

  • 要滿足x,y都是整數,暴力就是從1到n-1列舉x,算出y是不是整數

  • 發現只有在\(x^2\)整除N的時候y是整數,這樣的話\(x^2\)一定包含N的所有質因數,把N進行質因數分解,x的最小取值也就有了

\[N=p_1^{c_1}p_2^{c_2}...p_m^{c_m} \]

\[x_{min}=p_1^{\left \lceil \frac{c_1}{2}\right \rceil}p_2^{\left \lceil \frac{c_2}{2}\right \rceil}...p_m^{\left \lceil \frac{c_m}{2}\right \rceil} \]

  • 只需要在1~N-1中找到可以整除\(x_{min}\)的數的個數再乘8就是答案

  • 乘8是因為有4個角,每個角連出的中間的三角形的直角頂點有兩種情況

Code
#include <cstdio>
#define int long long 

int n;

signed main() {
    freopen("tri.in", "r", stdin);
    freopen("tri.out", "w", stdout);
    while (1) {
        scanf("%lld", &n);
        if (!n) break;
        int x = n, s = 1;
        for (int i = 2; i * i <= x; ++i) {
            if (x % i) continue;
            int cnt = 0;
            for (; x % i == 0; x /= i) cnt++;
            cnt = cnt + 1 >> 1;
            while (cnt--) s *= i;
        }
        if (x > 1) s *= x;
        printf("%lldn", (n - 1) / s * 8);
    }
    return 0;
}

序列 (Unaccepted)

  • 倍增加二分瞎搞,還沒判共比的範圍就拿了95,差一點就AK了。