题目大意
现有函数
给定一些正整数对(ni, ci),输出fci(ni)在模1e9+7意义下的函数值。
思路
观察公式不难看出fc(x)=ck,k与函数递归次数相关。要求到最大值,贪心的想法是尽可能多地递归,这样就能累乘到更多的c。最好的情况是每次递归都只消去一个 质因子,这样k=质因子的个数。
实现上,从x开始递归 ,找每个数除了自己外最大的因数,直到当前数是质数或1。记录这个过程中递归层数,这个层数就是k。可以先预存好值来提升效率。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int LIM = 1e6 + 10; const ll MOD = 1e9 + 7; //arr[i]中存i的质因子个数 int arr[LIM], t, n, c; ll powMod( ll x, int y ) { ll ans = 1; while ( y ) { if ( y & 1 ) ans = ans * x % MOD; y >>= 1; x = x * x % MOD; } return ans; } void findPrimeFactors( int x ) { if ( arr[x] ) return; for ( int i = 2; i*i <= x; i++ ) { if ( !(x % i) ) { int tmp = x / i; findPrimeFactors( tmp ); arr[x] = arr[tmp] + 1; return; } } arr[x] = 1; return; } int main() { arr[1] = 0; for ( int i = 2; i <= LIM; i++ ) findPrimeFactors( i ); scanf( "%d", &t ); while ( t-- ) { scanf( "%d%d", &n, &c ); printf( "%lld\n", powMod( 1ll * c, arr[n] ) ); } return 0; }
评论
还没有任何评论,你来说两句吧!