列表

详情


NC232530. Color

描述

n个珠子组成的项链,用n种颜色染色,能够组成多少种不同的项链。(旋转后相同算同一种项链)
答案可能很大,请输出后的结果。

输入描述

第一行包含一个整数,表示T组数据。
接下来T行,每一行包含两个整数

输出描述

输出T行,每一行输出一个整数表示答案。

示例1

输入:

5
1 30000
2 30000
3 30000
4 30000
5 30000

输出:

1
3
11
70
629

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 1100ms, 内存消耗: 552K, 提交时间: 2022-10-17 13:08:34

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int qsm(int a, int b, int mod) {
    int s = 1;
    a %= mod;
    while (b) {
        if (b & 1) s = s * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return s;
}
int get_phi(int x) {
    int phi = 1;
    for (int i = 2; i <= x / i; i++) {
        if (x % i == 0) {
            x /= i;
            phi = phi * (i - 1);
            while (x % i == 0) x /= i, phi *= i;
        }
    }
    if (x > 1) phi *= (x - 1);
    return phi;
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n, p;
        scanf("%d%d", &n, &p);
        int ans = 0;
        for (int i = 1; i <= n / i; i++) {
            if (n % i == 0) {
                ans += get_phi(n / i) % p * qsm(n, i - 1, p) % p, ans %= p;
                if (i != n / i) ans += get_phi(i) % p * qsm(n, n / i - 1, p) % p, ans %= p;
            }
        }
//        printf("%d\n", ans * get_inv(n, p) % p);
        printf("%d\n", ans);
    }
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 457ms, 内存消耗: 536K, 提交时间: 2022-07-31 09:04:13

#include<bits/stdc++.h>
#define ll long long
using namespace std ;
int T,n,p ;
int qsm(int a,int b,int mod)
{
	int ans=1 ;
	while(b)
	{
		if(b&1) ans=(ll)ans*a%mod ;
		a=(ll)a*a%mod ; b>>=1 ;
	}
	return ans ;
}
int phi(int n)
{
	int ans=n ;
	for(int i=2;i*i<=n;++i)
		if(n%i==0)
		{
			ans=ans/i*(i-1) ;
			while(n%i==0) n/=i ;
		}
	if(n>1) ans=ans/n*(n-1) ;
	return ans ;
}
int main()
{
	cin>>T ;
	while(T--)
	{
		cin>>n>>p ;
		int ans=0 ;
		for(int d=1;d*d<=n;d++)
			if(n%d==0)
			{
				ans+=(ll)phi(d)*qsm(n,n/d-1,p)%p ;
				if(ans>=p) ans-=p ;
				if(d*d!=n)
				{
					ans+=(ll)phi(n/d)*qsm(n,d-1,p)%p ;
					if(ans>=p) ans-=p ;
				}
			}
		cout<<ans<<'\n' ;
	}
	return 0 ;
}

上一题