B.Problème GCD de base [打 表] [optimiser le facteur premier maximum] [optimiser la puissance rapide] ou [tamis premier] [décomposition du facteur premier]

En tant que grand ACMer, ZYB est également bon en mathématiques et en théorie des nombres. 

 

ZYB construit une fonction fc (x) fc (x) telle que: 

En tant que grand ACMer, ZYB est également bon en mathématiques et en théorie des nombres. 

 

ZYB construit une fonction fc (x) fc (x) telle que: 

Insérez la description de l'image ici

Donnez quelques paires d'entiers positifs (ni, ci) (ni, ci), ZYB veut connaître fci (ni) mod (109 + 7) fci (ni) mod (109 + 7).

Entrez la description:

 

L'entrée contient plusieurs cas de test. La première ligne d'entrée contient un entier T (1≤T≤106) T (1≤T≤106).

Dans les lignes TT suivantes, chaque ligne contient deux entiers ni, cini, ci (1≤ni, ci≤1061≤ni, ci ≤106) décrivant une question.

Description de la sortie:

For each test case, output one integer indicating the answer.

Exemple 1

entrer

copie

2
3 3
10 5

Production

copie

3
25

Donnez quelques paires d'entiers positifs (ni, ci) (ni, ci), ZYB veut connaître fci (ni) mod (109 + 7) fci (ni) mod (109 + 7).

Entrez la description:

 

L'entrée contient plusieurs cas de test. La première ligne d'entrée contient un entier T (1≤T≤106) T (1≤T≤106).

Dans les lignes TT suivantes, chaque ligne contient deux entiers ni, cini, ci (1≤ni, ci≤1061≤ni, ci ≤106) décrivant une question.

Description de la sortie:

For each test case, output one integer indicating the answer.

Exemple 1

entrer

copie

2
3 3
10 5

Production

copie

3
25

Lisez la question plusieurs fois pour comprendre, C ^ n, n = facteur maximum

Facteur qualitatif

	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;
    }

Optimiser le facteur qualité

	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;
    }

Optimiser la puissance rapide

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;
}

code 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]));
    }
}

nombre premier

#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)));
    }
}

référence

https://blog.csdn.net/moasad/article/details/107463673?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159531859219725211926889%2522%252C%2522scm%2522%253Fid%2522%253A%2522159531859219725211926889%2522%252C%2522scm%2522%253Ane% = 159531859219725211926889 & biz_id = 0 & utm_medium = distribuer.pc_search_result.none-task-blog-2 ~ blog ~ first_rank_v2 ~ rank_blog_default-4-107463673.pc_v2_rank_blog_default & utm_ multi -term = quatrième jeu scolaire Niuke 2020

https://zaizai.blog.csdn.net/article/details/107470600?ops_request_misc=&request_id=&biz_id=102&utm_term=2020 Niuke Duo School Quatrième session & utm_medium = distribuer.pc_search_result.none-task-blog-2 ~ blog par défaut ~ sobaidub -0-107470600

Je suppose que tu aimes

Origine blog.csdn.net/qq_43660826/article/details/107492750
conseillé
Classement