B.Gcd(hdu6545)

重点重点是和的最大公约数最大,两部分的分别的最大公约数一定也是两部分和的最大公约数,所以直接求和就好了,用等差数列前n项和公式,sum=n*(n-1)/2;
然后倒着找最大公约数,(就从前往后枚举最小的因数,然后用和除较小的因子即可得到最大的因子)
从前向后硬找因子会t,所以就用了上面那个办法
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; int main() { ll n; while(~scanf("%lld",&n)) { ll sum=n*(n+1)/2;//前n项和公式 (首项+尾项)*项数/2 for(ll i=2;i<sum/i;i++) { if(sum%i==0) { printf("%lld\n",(sum/i)); break; } } } return 0; }

浙公网安备 33010602011771号