ZOJ 2345 国王金币数

//2345国王金币数
//思路:先找出allnum(allnum<=n)使allnum=1+2+3+…+k,同时算出k,则f(allnum)=∑i^2,
//      而f(n)=f(allnum)+(n-allnum)*(k+1).  已知公式∑i^2=k*(k+1)*(2k+1)/6
#include<iostream>
#include<math.h>
using namespace std;

 


void coins(int n)
{
    int k=1;
    int allnum=n;
    k=pow(2*allnum,0.5);
    while(!(2*allnum%k==0 && 2*allnum==k*(k+1)))
    {
        allnum--;
        k=pow(2*allnum,0.5);
    }

    int fun;
    fun=k*(k+1)*(2*k+1)/6+(k+1)*(n-allnum);
    cout<<n<<" "<<fun<<endl;
}

 

 

int main()
{
    int casenum;
    cin>>casenum;
    while(casenum--)
    {
        int n;
        while(cin>>n && n!=0)
            coins(n);

        if(casenum)
            cout<<endl;
    }
    return 0;
}

你可能感兴趣的:(ZOJ)