ZCMU 1887 數論(數字拆解)

2021-08-21 03:38:48 字數 1022 閱讀 1644

題目鏈結

題意:給乙個數字x要求將x拆分成a1+a2+a3+...+an,n個數字,數字個數隨意可以為1個。求某一拆分方法使得a1*a2*a3*...*an最大,輸出這個最大值。

思路:除了1,2,3,4以外任何數字將其從乙個數字拆成兩個適當的數字再相乘都能使得結果變大,那麼乙個數字要想結果盡量大必定要使得拆分出來的數字盡量多。數字盡量多就會使得每個數字盡量小並且數字就會連續,因此可以考慮使用數字的階乘來表示此題的結果。

對於給定x,先進行二分等式t*(t+1)/2-1,得到乙個數字t,t*(t+1)/2-1小於等於x且盡量接近x,此外還有乙個剩餘數字r=x-t*(t+1)/2+1。r是個餘數我們要充分的去利用它使得結果變大,變大的方式當然是加給1,2,3,。。。,t中的某個數字。不難發現將r加給某個數字ti,最終結果增大2*3*4...*ti-1*ti+1*...*tt*r,因此要想結果盡量**擇的ti當然要盡量小,但也不能太小起碼要使得ti+r>t,故最好的選擇為t+1-r。

有乙個小問題需要考慮當t+1-r等於1時,因為在選擇數字時為使得結果盡量大1已經被我們捨棄了,所以這種情況應該特殊處理。

c++**:

#includeusing namespace std;

typedef long long ll;

const int maxn = 100010;

const int mod = 1e9+7;

ll a[maxn],b[maxn];

ll qpow( ll x , ll y )

return res;

}int main()

ll t = x-( r*(r+1)/2-(ll)1 );

ll c = r+1-t;

if ( c>1 )

printf ( "%lld\n" , a[r+1]*b[c]%mod );

else

printf ( "%lld\n" , a[r+2]*b[2]%mod*b[r+1]%mod );}}

return 0;

}

數論 數的倍數

曾在做牛客的小白賽遇到這樣的問題,我來總結下 牛客原題鏈結如下 題目很簡單,但是需要總結下,accepted 如下。所有數字的和為3的倍數的數為3的倍數 末位為5或0的數為5的倍數 末三位相加為8的倍數的數為8的倍數 如果乙個整數的奇數字上的數字之和與偶數字上的數字之和的差能 被11整除,那麼這個數...

數論 7041125因子數

因子數 7041125因子數 難度級別 b 執行時間限制 1000ms 執行空間限制 51200kb 長度限制 2000000b 試題描述 計算c n,k 的因子的個數。輸入有多行,每行包含兩個正整數 n 和 k 用乙個空格分隔。輸出多行,每行包含乙個數,依次為各組輸入資料對應的結果。輸入示例 5 ...

數論常用內容 數根

對於數根可能接觸的不多,但是我覺得這裡還是應該做一下簡單的總結和介紹 數根 數根 又稱數字根digital root 是自然數的一種性質,每個自然數都有乙個數根。數根是將一正整數的各個位數相加 即橫向相加 若加完後的值大於等於10的話,則繼續將各位數進行橫向相加直到其值小於十為止,最後得到的數字就是...