牛客多校第四场【B-Basic Gcd Problem】
题目链接:https://ac.nowcoder.com/acm/contest/5669/B
思路:先要理解公式,多看几个数据基本就会有点想法,但是有思路直接暴力会t,要用素数筛(线性筛(欧拉筛)或者埃筛)(可以在这里看筛子https://blog.csdn.net/codetypeman/article/details/81459904)还有用快速幂取模(网上找板子就好)还有就是这两个的运用!这两个一直运用不好我真一直ttttttttttttttt。
看代码吧
(我也是借鉴大佬的,https://blog.csdn.net/qq_43765333/article/details/107470600)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll myquickpow(ll a,ll b)
{
ll ans=1;
while(b){
if(b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans;
}
const ll N=1e6+10;
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;
// cout<<prime;
for(ll j=2;i*j<N;j++)
isprime[i*j]=0;
}
}
}
ll solve(ll n)
{
ll sum=0;
for(ll i=0;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",myquickpow(c,solve(n)));
}
}
看了一些ac的代码,这种思路的居多,还有一些特别短的着实还没看明白……