E 解方程

解方程

https://ac.nowcoder.com/acm/contest/10746/E

图片说明

移项后是个分数,分离常数项出来得到
图片说明
容易知道x一定大于b,所以就是看ab有多少个因子个数
直接sqrt计算会TLE
所以预处理出来1e6以内的素数即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+50;
bool vis[N];
int pri[N],tot;
void init(){
    for(ll i=2;i<N;i++){
        if(!vis[i]){
            pri[tot++]=i;
            for(ll j=i*i;j<N;j+=i) vis[j]=1;
        }
    }
}
int main(){
    init();
    int T;cin>>T;
    while(T--){
        ll x,y;cin>>x>>y;
        ll ans=1;
        ll q=x*y;
        for(int i=0;i<tot;i++){
            if(q%pri[i]==0){
                int cnt=0;
                while(q%pri[i]==0) q/=pri[i],++cnt;
                ans*=(cnt+1);
            }
        }
        if(q!=1) ans*=2;
        cout<<ans<<endl;
    }
    return 0;
}
全部评论
其实还是可以使用 sqrt 的,但是一开始不能把两个数乘在一起,而是分开统计。
点赞 回复 分享
发布于 2021-01-10 22:22
...居然这么简单..+
点赞 回复 分享
发布于 2021-01-10 22:17

相关推荐

01-30 16:13
浙江大学 Java
点赞 评论 收藏
分享
程序员小白条:这还能没面试?不过简历确实不像国内写的简历
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务