優れたACMerとして、ZYBは数学と数論も得意です。
ZYBは、次のような関数fc(x)fc(x)を作成します。
優れたACMerとして、ZYBは数学と数論も得意です。
ZYBは、次のような関数fc(x)fc(x)を作成します。
。
いくつかの正の整数ペア(ni、ci)(ni、ci)を指定すると、ZYBはfci(ni)mod(109 + 7)fci(ni)mod(109 + 7)を知りたいと考えています。
説明を入力してください:
入力には複数のテストケースが含まれています。入力の最初の行には、1つの整数T(1≤T≤106)T(1≤T≤106)が含まれています。
次のTT行では、各行に1つの質問を説明する2つの整数ni、cini、ci(1≤ni、ci≤1061≤ni、ci≤106)が含まれています。
出力の説明:
For each test case, output one integer indicating the answer.
例1
入る
コピー
2
3 3
10 5
出力
コピー
3
25
。
いくつかの正の整数ペア(ni、ci)(ni、ci)を指定すると、ZYBはfci(ni)mod(109 + 7)fci(ni)mod(109 + 7)を知りたいと考えています。
説明を入力してください:
入力には複数のテストケースが含まれています。入力の最初の行には、1つの整数T(1≤T≤106)T(1≤T≤106)が含まれています。
次のTT行では、各行に1つの質問を説明する2つの整数ni、cini、ci(1≤ni、ci≤1061≤ni、ci≤106)が含まれています。
出力の説明:
For each test case, output one integer indicating the answer.
例1
入る
コピー
2
3 3
10 5
出力
コピー
3
25
質問を何度も読んで理解してください、C ^ n、n =最大係数
定性的要因
int arr[N] = {0};//N == 1e6 + 5
for(int i = 1;i <= N;i++)
{
int sum = 0,n = i;
for(int j = 2;j * j <= n;j++)
while(n % j == 0)
sum++,n/=j;
if(n > 1) sum++;//标准的质因数分解模板,分解出来个数
arr[i] = sum;
}
品質係数を最適化する
int arr[N] = {0};//N == 1e6 + 5
for(int i = 1;i <= N;i++)
{
int sum = 0,n = i;
for(int j = 2;j * j <= n;j++)
{
while(n % j == 0)
{
sum++,n/=j;
if(arr[n] != 0)//这个数前面已经处理过了,那么就直接加就可以了,不用再判断了
{
arr[i] = arr[n] + sum;
n = 0;
break;
}
}
if(n == 0) break;
}
if(n == 0) continue;
if(n > 1) sum++;
arr[i] = sum;
}
高速電力を最適化
ll quick_pow(ll a,ll b,ll mod)
{
ll ans = 1;
while(b)
{
if(b&1)
ans = a*ans%mod;
b>>=1;
a = a*a%mod;
}
return ans%mod;
}
ACコード
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const int mod = 1e9+7;
typedef long long ll;
int arr[N],t;
ll quick_pow(ll a,ll b)
{
ll ans = 1;
while(b)
{
if(b&1)
ans = a*ans%mod;
b>>=1;
a = a*a%mod;
}
return ans%mod;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
for(int i = 1;i <= N;i++)
{
int sum = 0,n = i;
for(int j = 2;j * j <= n;j++)
{
while(n % j == 0)
{
sum++,n/=j;
if(arr[n] != 0)
{
arr[i] = arr[n] + sum;n = 0;
break;
}
}
if(n == 0) break;
}
if(n == 0) continue;
if(n > 1) sum++;
arr[i] = sum;
}
scanf("%d",&t);
while(t--)
{
ll n,c;
scanf("%lld %lld",&n,&c);
printf("%lld\n",quick_pow(c,arr[n]));
}
}
素数筛
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll N=1e6+10;
ll power(ll a,ll b){return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}
ll prime[N],k,t,n,c;
bool isprime[N];
void Prime(){
fill(isprime,isprime+N,1);
k=0;
prime[1]=0;
for(ll i=2;i<N;i++){
if(isprime[i]){
prime[k++]=i;
for(ll j=2;i*j<N;j++)
isprime[i*j]=0;
}
}
}
ll solve(ll n){
ll cnt=0,sum=0;
for(ll i=0;i<k&&prime[i]*prime[i]<=n;i++){
if(n%prime[i]==0){
while(n%prime[i]==0){
sum++;
n/=prime[i];
}
}
}
if(n>1) sum++;
return sum;
}
int main(){
Prime();
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&c);
printf("%lld\n",power(c,solve(n)));
}
}
参照