HDU 4432 Sum of divisors

来源:互联网 发布:鼠标测试软件绿色版 编辑:程序博客网 时间:2024/05/16 11:59

题意:输入n、m,将n的所有因数转化成m进制的数,并将转化后的每一位数字的平方和加起来,再将这个和转化成m进制的数输出

解题思路:模拟.用vector容器分别存储因数和转化后的数,这里需要注意的是求n的因数时不能直接遍历1~n,会超时,可以遍历1~sqrt(n),每次加入两个因数,节省时间,但是要特判如果n是某个数的平方,就直接加入这一个数字即可,不然会重复加入。还要注意的就是如果转化后的数字>=10&&<=15,就要变成对应的A~E,不然就会出错

代码:

#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cmath>#include <cstdio>#include <vector>using namespace std;typedef long long ll;ll n,m,sum;vector<ll> v1,v2;void solve(ll x){    for(ll i=1; i*i<=x; i++)    {        if(x%i==0&&i*i<x){v1.push_back(i);v1.push_back(x/i);}        else if(x%i==0&&i*i==x)v1.push_back(i);//防止i加入两次    }}void change(ll x,ll k){    v2.clear();    while(x)    {        ll a=x%k;        x/=k;        v2.push_back(a);    }}int main(){    while(scanf("%I64d%I64d",&n,&m)==2)    {        v1.clear();        sum=0;        solve(n);        for(ll i=0; i<v1.size(); i++)        {            change(v1[i],m);            for(int i=0; i<v2.size(); i++)            {                sum+=v2[i]*v2[i];            }        }        change(sum,m);        for(int i=v2.size()-1; i>=0; i--)        {            if(v2[i]>=10&&v2[i]<=15)printf("%c",v2[i]-10+'A');//转成字母            else printf("%I64d",v2[i]);        }        cout<<endl;    }    return 0;}


原创粉丝点击