牛客多校的账号是组里一同学单独买的,看他在群里说别***当天就只看了看题。这道题一开始没把式子看懂,后来自己举了几个例子发现其实就是最多有几个c相乘输出其值。以样例来说 f(10)=5 * f(gcd(5,10))=5 * f(5)=5* 5* f(1)=25.也就是说,这个函数退出的条件就是f(gcd(i,x))=1,也就是说跟gcd有关,就不难想到只要分解x的质因数数量并且把每一个都用上就可以得到最多个c相乘,即递归次数最多。
再举个例子:8用质因数相乘表示即为->8=2* 2* 2 所以f(8)=
c* f(gcd(2,8))=c* f(4)=c* c* f(gcd(2* 2))=c* c* f(2)=c* c* c* f(gcd(1,2))=c* c* c* f(1)=c^3.
补充几个知识点:
质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数)
质因数(或质因子)在数论里是指能整除给定正整数的质数。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。
正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以指数表示。
#include <bits/stdc++.h> const int MOD = 1e9 + 7; using namespace std; typedef long long ll; typedef unsigned long long ull; int n, c, cnt; ll ksm(ll a, ll b, ll MOD) { ll res=1,base = a; while(b) { if(b%2) { res=res*a%MOD; } a=a*a%MOD; b/=2; } return res; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) { cin >> n >> c; cnt=0; for(int i=2;i*i<=n;i++) { while (n%i==0) { cnt++; n/=i; } } if(n>1) cnt++; ll ans;ans=ksm(c,cnt,MOD); cout << ans << endl; } return 0; }