安科校赛E题-最大GCD

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans,flag,n,k,T;
int main(){
    scanf("%d",&T);
    while(T--)
    {
        flag=0;
        scanf("%d%d",&n,&k);
        for(int i=1;i*i<=n;i++){
            if(n%i==0&&n>=i*(k+1)*k/2){
                ans=i;
                flag=1;
            }
        }
        if(flag){
            for(int i=1;i<=k-1;i++){
                cout << ans*i<<" ";
            }
            cout << n-(k-1)*k/2*ans<<endl;
        }
        else
        {
            cout << -1 <<endl;
        }
    }


	return 0;
}

测试数据错了,应该为10的8次方。o(n)复杂度
枚举n的除数就是最大公约数 i ,枚举到n,从小到大枚举到最大可行值。如果 n>=i*(k+1)*k/2 ,那么可求得 前k-1项分别为t,2t…(k-1)t,第k项为n-前(k-1)项和,因为n为t的倍数,减出的第k项一定为t的倍数。否则,不存在,输出-1。

猜你喜欢

转载自blog.csdn.net/w1304636468/article/details/89435114
今日推荐