這道題我被坑的很慘,最開始一看題,就覺得是按照從小到大的順序找出n的所有因子,然後再找出所有因子中最長的連續子因子就好了。設dp[i]為以i結尾,它擁有多少個連續因子。運用動態轉移方程:
if(ss[i] - ss[i - 1] == 1)
dp[i] = dp[i - 1] + 1;
else
dp[i] = 1;
但是我題目並沒有完全弄清楚,首先n的範圍過大,直接o(n)找因子要超時,必須要用o(sqrt(n))的演算法;其次,輸出需要是最小的連續子因子;然後我還完全沒弄明白連續子因子的概念,也就是說,所有因子相乘必須能夠被n整除,比如樣列,5*6*7 = 210,210可以被630整除。最後還有乙個bug,比如60,它的因子連續的有2,3,4,5,6,它的前面2,3,4不能組成連續因子,因為2*3*4 = 24,24不能被60整除,但是3*4*5 = 60,剛剛可以被60整除。因此它的答案為3*4*5。
最開始這些情況我沒有考慮到,尤其是最後一點。後來我通過網上找**,稍微修改一下,讓它輸出2到100的結果,再與我的**的結果對比,才找出這個bug。
雖然我的**有點醜,但還是上**:
#include #include #include #include #include #include #define maxn 1005
using namespace std;
int main()
mm++; //mm記有多少個連續因子
}if(n % sum == 0)
dp[i] = mm;
else
dp[i] = mm - 1;
}else
}int re = 0, f = 0;
for(int i = 0; i < m; i++)
}if(re == 0)
else}}
return 0;
}
L1 006 連續因子
乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3 5 6 7,其中5 6 7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。輸入格式 輸入在一行中給出乙個正整數n 131 輸出格式 首先在第1行輸出最長連續因子的個數 然後在第2行...
L1 006 連續因子
乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3 5 6 7,其中5 6 7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。輸入格式 輸入在一行中給出乙個正整數n 131 輸出格式 首先在第1行輸出最長連續因子的個數 然後在第2行...
L1 006 連續因子
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3 5 6 7,其中5 6 7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連...