1 条题解

  • 0
    @ 2025-8-24 23:07:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Eason_cyx
    Play like you never did before?

    搬运于2025-08-24 23:07:09,当前版本为作者最后更新于2024-12-18 13:35:42,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    @junjie_zhao 在我写这题的时候一直嘲讽我 /kel

    感谢 @Augenstern5 提供的指导。


    nm=xn-m=x,则题目中的条件变为

    n(nx)modx=0n(n-x) \bmod x = 0

    展开,得

    n2nxmodx=0n^2-nx \bmod x = 0

    显然有 nxmodx=0nx \bmod x = 0,所以问题变成了 n2modx=0n^2 \bmod x = 0,也就是找 n2n^2 的所有因数,且由于 1m<n1 \le m \lt n,所以我们要找的就是 1x<n1 \le x \lt n 中所有 n2n^2 因数的个数。

    n2n^2 共有 pp 个因子,那么显然 pp 是奇数。注意到 n2n^2 的因子中除了 nn 以外一定可以分成 p12\frac{p-1}{2} 组,每组的两个数 a,ba,b 都可以有 a×b=n2a \times b = n^2。那么显然一定有 max(a,b)>n\max(a,b) > n,所以这样每一组对答案的贡献就是 11;那么最后答案就是 p12\frac{p-1}{2}

    又因为显然有如下结论:

    假设 n=p1q1p2q2pkqkn=p_1^{q_1}p_2^{q_2}\dots p_k^{q_k},那么 $n^2=p_1^{2\times q_1}p_2^{2\times q_2}\dots p_k^{2\times q_k}$。

    所以最终直接对 nn 进行质因数分解即可。假设我们得到了 n=p1q1p2q2pkqkn=p_1^{q_1}p_2^{q_2}\dots p_k^{q_k},则有一个定理:nn 的质因数个数为 i=1k(qi+1)\displaystyle\prod_{i=1}^{k}(q_i+1)。所以有 p=i=1k(2×qi+1)p=\displaystyle\prod_{i=1}^{k}(2\times q_i+1)

    时间复杂度 O(Tn)O(T\sqrt n)

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    unordered_map<int, int> mp;
    signed main() { ios::sync_with_stdio(false); cin.tie(0);
    	int t; cin >> t;
    	while(t--) {
    		int n; cin >> n; mp.clear();
    		for(int i = 2;i * i <= n;i++)
    			if(n % i == 0) {
    				while(n % i == 0) n /= i, mp[i]++;
    			} if(n != 1) mp[n]++; for(auto i : mp) mp[i.first] *= 2;
    		long long num = 1; for(auto i : mp) num = (num * (mp[i.first] + 1)); cout << num / 2 << "\n";
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    10892
    时间
    1500ms
    内存
    512MiB
    难度
    3
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者