JZOJ4919. 神炎皇

来源:互联网 发布:网络硬盘录像机哪个好 编辑:程序博客网 时间:2024/06/07 19:08

题目大意

给定n求有多少个数对(a,b)满足a+bn(a+b)ab的因子。

Data Constraint
n1014

题解

显然要求aba+b是一个整数。
先提出一个公因数d,得

daba+b

(a,a+b)=1,(b,a+b)=1

(ab,a+b)=1

所以要求da+b的倍数。
k=a+b
d可写为d=k×c的形式。
k×dn
cnk2
所以d的取值有nk2
ab的取值有ϕ(k)个。
枚举k然后统计即可。

时间复杂度:O(n)

SRC

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std ;#define N 10000000 + 10typedef long long ll ;bool flag[N] ;int Pri[N] , Phi[N] ;ll n , ans ;void Pre() {    Phi[1] = 1 ;    for (int i = 2 ; i < N ; i ++ ) {        if ( !flag[i] ) {            Pri[++Pri[0]] = i ;            Phi[i] = i - 1 ;        }        for (int j = 1 ; j <= Pri[0] ; j ++ ) {            if ( (ll)i * Pri[j] >= N ) break ;            flag[i*Pri[j]] = 1 ;            if ( i % Pri[j] == 0 ) { Phi[i*Pri[j]] = Phi[i] * Pri[j] ; break ; }            Phi[i*Pri[j]] = Phi[i] * Phi[Pri[j]] ;        }    }}int main() {    freopen( "uria.in" , "r" , stdin ) ;    freopen( "uria.out" , "w" , stdout ) ;    Pre() ;    scanf( "%lld" , &n ) ;    ll UP = sqrt(n) ;    for (ll k = 2 ; k <= UP ; k ++ ) ans += n / (k * k) * Phi[k] ;    printf( "%lld\n" , ans ) ;    return 0 ;}

以上.

2 0
原创粉丝点击