列表

详情


NC54752. wnm喜欢的数学题

描述

wnm在退役之后觉得非常无聊,于是他开始学习数论。一天他碰到一道这样的问题,定义函数f(n)为使得lcm(i,j)=n的二元组的个数,例如n=6的话,满足条件的二元组是(1,6),(6,1),(2,3),(3,2),(2,6),(6,2),(3,6),(6,3),(6,6)所以f(6)=9,wnm觉得这个问题太简单了所以他想来考考你,给你一个n求f(n)等于多少。

注:lcm(i,j)为i和j的最小公倍数。

输入描述

一个整数n(n<=1e12)

输出描述

一个整数表示答案

示例1

输入:

3

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 17ms, 内存消耗: 492K, 提交时间: 2020-04-25 16:31:36

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> f;
int main(){
    ll n,i;cin>>n;
    for(i=1;i*i<n;i++){
        if(n%i==0){
            f.push_back(i);
            f.push_back(n/i);
        }
    }
    if(i*i==n) f.push_back(i);
    ll sum=0,cnt=f.size();
    for(int i=0;i<cnt;i++){
        for(int j=0;j<cnt;j++){
            if(f[i]/__gcd(f[i],f[j])*f[j]==n) sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

C++ 解法, 执行用时: 21ms, 内存消耗: 320K, 提交时间: 2021-09-27 22:04:04

#include<bits/stdc++.h>
using namespace std;
vector<long long>v;
void get_div(long long n)
{
	for(int i=1;i<=n/i;i++)
	{
		if(n%i==0){
			v.push_back(i);
			if(i!=n/i)
			v.push_back(n/i);
		}
	}
}
int main()
{
	long long n,sum=0;
	cin>>n;
	get_div(n);
	for(auto i:v){
		for(auto j:v){
			if(i/__gcd(i,j)*j==n)sum++;
		}
	}
	cout<<sum;
	return 0;
}

上一题