hdu5084 HeHe(打表找规律)

写在开头。。。不知道一开始怎么想的,打了个很奇葩的表。。。。只是看出素数为2。论不会打表的重要性。。。
你如果打了个正确的表会发现,因为n > 2, h e [ n ] he[n] 结果都是2 的幂,然后可以猜测:如果n的质因子个数为 k k ,那么 h e [ n ] = 2 k he[n] = 2^k 。(说的好轻巧)
所以我们要求 h e h e [ n ] hehe[n] 的话,就是求 1 n 1-n 中每个数的质因子个数之和,然后直接快速幂即可。
至于正解是什么积性函数。写的还不错
A C   C o d e : AC \ Code:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<map>
using namespace std;
typedef long long ll;
const int N = 1e7;
ll prim[N+10];
bool vis[N+10];
int tot ;
void prime(){
    vis[1] = 1;
    int m = sqrt(N + 0.5);
    for(int i = 2;i <= m;++i){
        if(!vis[i])
        for(int j = i * i;j <= N;j += i) vis[j] = 1;
    }
    for(int i = 2;i <= N;++i){
        if(!vis[i]) prim[++tot] = i;
    }
}
ll Qpow(ll a,ll b,ll p){
    ll ans = 1;
    a %= p;
    while(b){
        if(b & 1) ans = ans * a % p;
        b >>= 1;
        a = a * a % p;
    }
    return  ans;
}
int main(){
    prime();
    int t;
    cin>>t;
    ll a,b;
    while(t --){
        cin>>a>>b;
        int p = 1;
        int sum = 0;
        while(p <= tot && prim[p] <= a){
             sum += a/prim[p++];
        }
       // cout<< sum ;continue;
        cout<<Qpow(2,sum,b)<<endl;
    }
}
发布了632 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/103980060