题目大意
给定n求有多少个数对
Data Constraint
n≤1014
题解
显然要求aba+b是一个整数。
先提出一个公因数d,得
∵(a′,a′+b′)=1,(b′,a′+b′)=1
∴(a′b′,a′+b′)=1
所以要求d是
令k=a′+b′
则d可写为
又k×d≤n
∴c≤nk2
所以d的取值有
a′b′的取值有ϕ(k)个。
枚举k然后统计即可。
时间复杂度:
SRC
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std ;
#define N 10000000 + 10
typedef 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 ;
}
以上.



被折叠的 条评论
为什么被折叠?



