NC50557. 樱花
描述
输入描述
一个整数n。
输出描述
一个整数,表示有多少对(x,y)满足题意。答案对取模。
示例1
输入:
2
输出:
3
说明:
共有三个数对(x,y)满足条件,分别是(3,6),(4,4)和(6,3)。Go 解法, 执行用时: 41ms, 内存消耗: 2288K, 提交时间: 2022-10-08 00:19:04
package main import ( "bufio" . "fmt" "os" ) const N = 1e6 + 10 const P = 1e9 + 7 var cnt, n int var st [N]bool var primes [N]int func get_prime(n int) { for i := 2; i <= n; i++ { if !st[i] { primes[cnt] = i cnt++ } for j := 0; primes[j] <= n/i; j++ { st[primes[j]*i] = true if i%primes[j] == 0 { break } } } } func main() { in := bufio.NewReader(os.Stdin) out := bufio.NewWriter(os.Stdout) defer out.Flush() Fscan(in, &n) get_prime(n) res := 1 for i := 0; i < cnt; i++ { s, p := 0, primes[i] for j := n; j > 0; j /= p { s += j / p } res = res * (2*s + 1) % P } Fprintln(out, res) }
C++11(clang++ 3.9) 解法, 执行用时: 11ms, 内存消耗: 4600K, 提交时间: 2020-08-17 13:09:43
#include<cstdio> using namespace std; const int N = 1e6; int p[N + 5], v[N + 5]; int main(){ int n, mod = 1e9 + 7, i, k, ans;long long j; scanf("%d", &n); for(i = 2, ans = 1;i <= n;i++){ if(!v[i]){ p[++p[0]] = i; for(j = i, k = 0;j <= n;j *= i)k = (k + n / j) % mod; ans = (2ll * k + 1) * ans % mod; }for(j = 1;j <= p[0] && i * p[j] <= n;j++){ v[i * p[j]] = 1; if(!(i % p[j]))break; } }printf("%d", ans); return 0; }
C++(g++ 7.5.0) 解法, 执行用时: 25ms, 内存消耗: 8252K, 提交时间: 2022-09-27 18:29:49
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+7; const int mod=1e9+7; int n,ans=1,vis[N]; signed main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n; for(int i=2;i<=n;++i){ if(!vis[i]){ for(int j=i+i;j<=n;j+=i) vis[j]=1; int c=0; for(int j=i;j<=n;j*=i) c+=n/j; ans=ans*(c<<1|1)%mod; } } cout<<ans<<"\n"; return 0; }