洛谷:P4980 【模板】Polya 定理

*转载于该题题解

#include<bits/stdc++.h>
using namespace std ;
#define rep( i, s, t ) for( register int i = s; i <= t; ++ i )
#define re register
#define int long long
int gi() {
	char cc = getchar() ; int cn = 0, flus = 1 ;
	while( cc < '0' || cc > '9' ) {  if( cc == '-' ) flus = - flus ; cc = getchar() ; }
	while( cc >= '0' && cc <= '9' )  cn = cn * 10 + cc - '0', cc = getchar() ;
	return cn * flus ;
}
const int P = 1e9 + 7 ; 
int T, n ; 
int fpow( int x, int k ) {
	int ans = 1, base = x ; 
	while( k ) {
		if( k & 1 ) ans = 1ll * ans * base % P ; 
		base = base * base % P, k >>= 1 ; 
	} return ans ; 
}
int phi( int x ) {
	int ans = x ; 
	for( re int i = 2; i <= sqrt(x); ++ i ) {
		if( x % i ) continue ;
		ans = ans - ans / i ;
		while( x % i == 0 ) x /= i ;
	}
	if( x != 1 ) ans = ans - ans / x ;
	return ans ; 
}
void inc( int &x, int y ) {
	( ( x += y ) >= P ) && ( x -= P ) ;
}
signed main()
{
	int T = gi() ; 
	while( T-- ) {
		int n = gi(), cnt = sqrt(n), Ans = 0 ; 
		for( re int i = 1; i <= cnt; ++ i ) {
			if( n % i ) continue ;
			int p1 = phi(i), f1 = fpow( n, n / i ) ; 
			f1 = f1 * p1 % P, inc( Ans, f1 ) ;
			if( i * i != n ) {
				int p2 = phi( n / i ), f2 = fpow( n, i ) ;
				f2 = f2 * p2 % P, inc( Ans, f2 ) ;
			}
		}
		cout << Ans * fpow( n, P - 2 ) % P << endl ; 
	}
	return 0 ;
}

关注一下下吧!!求求了!!!我会回关的!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值