NC20194. [JSOI2013]丢番图
描述
输入描述
一行,仅一个整数n(1 ≤ N ≤ 10^14)
输出描述
一行,输出对于给定整数n,满足方程(1)的本质不同的解的个数。
示例1
输入:
4
输出:
3
C++(g++ 7.5.0) 解法, 执行用时: 126ms, 内存消耗: 420K, 提交时间: 2022-11-05 18:01:00
#include<bits/stdc++.h> using namespace std; #define int long long int n, ans = 1; signed main() { cin >> n; for(int i = 2; i * i <= n; ++ i) { if(n % i == 0) { int sum = 0; while(n % i == 0) sum++, n /= i; ans *= 2 * sum + 1; } } if(n > 1) ans *= 3; cout << (ans + 1) / 2; return 0; }
C(clang 3.9) 解法, 执行用时: 95ms, 内存消耗: 376K, 提交时间: 2020-08-07 15:36:10
#include<stdio.h> int main() { long long n,i,t,p; scanf("%lld",&n); t=1; for(i=2;i*i<=n;i++) { if(n%i==0) { p=0; while(n%i==0) { p++; n/=i; } t*=(2*p+1); } } if(n>1) t*=(2*1+1); printf("%lld\n",(t+1)/2); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 177ms, 内存消耗: 504K, 提交时间: 2020-08-14 13:53:52
#include<cstdio> using namespace std; typedef long long ll; int main(){ ll n, ans, j, i; scanf("%lld", &n); for(i = 2, ans = 1;i <= n / i;i++){ for(j = 0;!(n % i);n /= i, j++); ans *= 2 * j + 1; }if(n > 1)ans *= 3; printf("%lld", (ans + 1) / 2); return 0; }