丢番图

题意:
对于一个给定的正整数n ,有多少种本质不同的解满足方程
1x + 1y = 1n (x,y,n∈N*)

n1e14

分析:
n = i=1kpcii
包括本质相同的解得个数
ans = i=1k(2ci+1)
证明:

x+yxyn(x+y)nxnxxn=1n=xy=(xn)y=y

令k=x-n,则x = k + n
n2+knk = y
n2k +n=y
y,n,k∈N*
原式解的个数为 n2 的约数个数
原题要求本质不相同的解的个数为(ans + 1) / 2 (x,y为2n的解只计算了一次)

#include <cstdio>
#include <cstring>

typedef long long LL;
const int N = 1e7 + 10,M = 1e6;
int prime[M],tot;
bool p[N];

void work() {
    for (int i = 2;i <= N - 10;i ++) {
        if (!p[i]) prime[++ tot] = i;
        for (int j = 1;j <= tot;j ++) if (prime[j] * i > N - 10) break;
        else p[prime[j] * i] = true;
    }
}

int main() {
    work();
    LL n,ans = 1;
    scanf("%lld",&n);
    for (int i = 1;i <= tot;i ++) if (prime[i] > n) break;else if (n % prime[i] == 0){
        LL t = 0;
        while (n % prime[i] == 0) {
            t ++;
            n /= prime[i];
        }
        ans *= 2 * t + 1;
    }
    if (n != 1) ans *= 3;
    printf("%lld",(ans + 1) >> 1);
}

考试时脑抽打了个不必要的线筛….

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值