【HDU】4135 Co-prime 容斥原理

来源:互联网 发布:淘宝欧时力旗舰店真假 编辑:程序博客网 时间:2024/05/22 03:27

传送门:【HDU】4135 Co-prime



题目分析:sqrt(n)的时间内找到n的所有质因数然后用容斥原理加加减减即可。


代码如下:


#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )#define FOR( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )#define REV( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )#define CLR( a , x ) memset ( a , x , sizeof a )typedef long long LL ;const int MAXN = 15 ;int S[MAXN] , top ;int n ;LL A , B ;void solve () {scanf ( "%I64d%I64d%d" , &A , &B , &n ) ;top = 0 ;int sqr = sqrt ( ( double ) n ) ;FOR ( i , 2 , sqr ) {if ( n % i == 0 ) {S[top ++] = i ;while ( n % i == 0 ) n /= i ;if ( n == 1 ) break ;sqr = sqrt ( ( double ) n ) ;}}if ( n > 1 ) S[top ++] = n ;int tot = 1 << top ;LL ans = B - A + 1 ;REP ( i , 1 , tot ) {int cnt = 0 ;LL tmp = 1 ;REP ( j , 0 , top ) {if ( i & ( 1 << j ) ) {tmp *= S[j] ;++ cnt ;}}if ( cnt & 1 ) ans -=  B / tmp - ( A - 1 ) / tmp ;else ans += B / tmp - ( A - 1 ) / tmp ;}printf ( "%I64d\n" , ans ) ;}int main () {int T , cas = 0 ;scanf ( "%d" , &T ) ;while ( T -- ) {printf ( "Case #%d: " , ++ cas ) ;solve () ;}return 0 ;}


0 0
原创粉丝点击