loj10202. 「一本通 6.2 练习 5」樱花

思路:
  原式子等价于(x-n)*(y-n) = n^2,即原题求n^2的因数个数,分解累加即可

  ————事实证明,敲对模板很重要,我线性筛少了个==0,结果效率变成了埃式筛的效率,只能过九个点。加上==0后,AC了!!!

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 7;
int n;
long long c[maxn];
int isnprime[maxn];
int prime[maxn];
long long ans = 1;
inline void findpri(){
    for(int i = 2; i <= n; ++i){
        if(!isnprime[i])    prime[++prime[0]] = i;
        for(int j = 1; j <= prime[0] && prime[j] < n/i; ++j){
            isnprime[i * prime[j]] = 1;
            if(i % prime[j] == 0)    break;
        }
    }
}
inline void divide(int x){
    for(int i = 1; prime[i] * prime[i] <= x; ++i){
        while(x % prime[i] == 0)
            x /= prime[i], c[prime[i]]++;
    }
    if(x != 1)    c[x]++;
}
int main(void) {
    cin >> n;
    findpri();
    for(int i = 1; i <= n; ++i)    divide(i);                    
    for(int i = 1; i <= prime[0]; ++i)
        ans = (ans * (c[prime[i]] << 1 | 1)) % mod;
    cout << ans << endl;         
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/junk-yao-blog/p/9507445.html