NYOJ 865 解题报告

来源:互联网 发布:js回调函数原理 编辑:程序博客网 时间:2024/06/05 07:20

F(x)

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
我们定义 F(x)是满足 x  mod(a*b) == 0这样的a,b的组数。现在给你一个n,你需要求出 F(n)
输入
有多组测试数据。
每组测试数据输入一个整数n (1 <= n <= 10^11)
输出
每组测试数据输出 Case x: y ,x 表示第x组测试数据,y表示F(n)的值,细节参考样例。
样例输入
1234
样例输出
Case 1: 1Case 2: 3Case 3: 3Case 4: 6

       这道题又是考察乘性函数的题目。首先我们分析一下 x  mod(a*b) == 0这个式子,可以发现a*b其实就是x的因子。记d为x的一个因子,那么所有d的因子拆分d=a*b的种数就是F(n)的值。写成数学式子,就是,其中是因子个数函数。数论里知道,因子个数函数是一个乘性函数,所以F也是一个乘性函数。所以,我们能推出,其中,

到此,这道题目就解决了!不过要注意当n=1时不能用上述公式计算,而是直接输出答案为1就好。

       附上我的代码:

#include <stdio.h>int main(){    long long n;    int case_times=1;    while((scanf("%lld",&n))!=EOF)    {        long long sum=1;        if(n>1)        {            long long i,temp=n,times;            int flag=0;            for(i=2;i*i<=temp;i++)            {                flag=times=0;                while(n%i==0)                {                    flag=1;                    times++;                    n/=i;                }                if(flag==1)                    sum=sum*(1+times)*(2+times)/2;            }        }        if(n>1)            sum=sum*3;        printf("Case %d: %lld\n",case_times++,sum);    }    return 0;}

        再来看看标程的:

 #include <cstdio>#include <cstring>#include <string>#include <queue>#include <algorithm>#include <vector>#include <cmath>#include <iostream>#include <ctime>using namespace std;const int N = 1e2+10;const int inf = 1<<30;typedef long long LL;LL find(LL k){    LL i, j, sum = 0;    for(i = 1;i * i <= k;i++)    {        if(k % i ==0)        {            sum++;            if(i*i != k)                sum++;        }    }    return sum;}LL solve(LL n){    LL sum = 0;    for(LL i = 1 ;i * i<= n;i++)    {        if(n % i == 0)        {            sum += find(i);            LL j = n/i;            if(j != i)                sum += find(j);        }    }    return sum;}int main(){    //freopen("Input.txt", "r", stdin);    //freopen("Output.txt", "w", stdout);    LL i, j, n, T = 1;    while(~scanf("%lld", &n))    {        LL sum = solve(n);        printf("Case %lld: %lld\n", T++,sum);    }}        



1 0
原创粉丝点击