AtCoder Beginner Contest 254 - D - Together Square 题解解释
原题
原文
Let be the largest square divisor of an integer .
Then, for integers and , is a square number if and only if is a square number.
Since is indivisible by a prime twice or more, is a square number if and only if
Therefore, it is sufficient to find for each integer , and to find .
After checking if each integer from through is a square number, we can find by bruteforcing every divisor of .
The complexity is .
翻译
我们令表示整数的因数中, 最大的平方数.
那么, 对于整数 i,j ,当且仅当是一个平方数时, 是一个平方数.
又因为 不能除以某个质数两次或者两次以上, 故当且仅当时, 是一个平方数.
因此, 只需对每个整数, 寻找对应的即可.
在初始化完前个数的平方数之后, 我们就可以通过枚举 的每个除数来寻找.
算法复杂度是.
上面的具体操作解释详见代码
解释
的含义
对于任意一个数, 都可进行质因数分解: , 其中为质数. 当 为平方数时, 中的将全为偶数. 可表示为, 其中均为偶数, 是的一个子集.
则可表示为, 其中的次数均为.
e.g.
对于整数 i,j ,当且仅当是一个平方数时, 是一个平方数
证明:
充分性:
若是一个平方数, 则可表示为, 其中均为偶数. 可表示为, 其中均为偶数.
显然, 它乘上之后, 各个因数都将是偶数次方, 故为一个平方数
必要性:
若是一个平方数, 则可表示为, 其中均为偶数. 可表示为, 其中均为偶数.
若不是一个平方数, 则其必有一个因数的次方为奇数次方, 记其为, 其中为奇数. 使乘上, 由于的各因数均为偶数次方, 因数的次方的奇偶性不会发生改变, 故此时的质因数分解中, 存在奇数次方的因数, 与其是平方数矛盾, 故原命题成立.
又因为 不能除以某个质数两次或者两次以上, 故当且仅当时, 是一个平方数
证明:
充分性:
当时, 显然是一个平方数, 其平方根即为
必要性:
上文提到, 可表示为, 其中的次数均为, 而一个平方数的质因数分解中的每个因数的次方都为偶数, 故的质因数分解中, 至少需要出现, 其中为奇数且只能为.
此时再增加任何一个因数的次数次方, 都不能使 平方数, 故.
由于“当且仅当是一个平方数时, 是一个平方数.”,并且“当且仅当时, 是一个平方数”,故由乘法原理知,我们只需求“满足是平方数的 i 的选法”,答案就是满足条件的 的数量的平方.
代码
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; vector<bool> sq(n+1,false); // 记录 i 是否为平方数 for(int i=1;i*i<=n;i++) sq[i*i]=true; vector<vector<int>> d(n+1); // d[i]记录的是 i 的所有因数,当然包括1和它本身 for(int i=1;i<=n;i++){ for(int j=i;j<=n;j+=i) d[j].push_back(i); } vector<int> cnt(n+1); for(int i=1;i<=n;i++){ int f=0; for(int j=0;j<d[i].size();j++) if(sq[d[i][j]]) f=d[i][j]; // 从小到大枚举因数,最后一个满足条件的就是最大的平方数因数 cnt[i/f]++; // // 乘法原理,不同的 i ,可能对应同一个i/f(i),它们之间可以任意搭配 } int ans=0; for(int i=1;i<=n;i++) ans+=cnt[i]*cnt[i];// 即上面所说的乘法原理 cout<<ans<<endl; }
本文作者:tsrigo
本文链接:https://www.cnblogs.com/tsrigo/p/16344714.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步