Codeforces Round #338 div 2 D. Multipliers 数论

来源:互联网 发布:云盘系统源码 编辑:程序博客网 时间:2024/05/15 09:44

题意:给出一个数x的所有质因子,求这个数所有因子的乘积%1e9+7。

思路:一个因子a必然有另一个因子b与它对应使得ab=x。设总因子数为k,所以答案就应该是xk2。这个k是怎么求的呢?因为
x=a1k1a2k2ankn
k=(k1+1)(k2+1)(kn+1)

处理xk2要非常注意。在这里被坑了好久。

PS:c++11 auto真是好用的说。

http://codeforces.com/contest/615/problem/D

/*********************************************    Problem : Codeforces    Author  : NMfloat    InkTime (c) NM . All Rights Reserved .********************************************/#include <map>#include <set>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define rep(i,a,b)  for(int i = (a) ; i <= (b) ; i ++) //遍历#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --) //反向遍历#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++) //遍历一个STL容器#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) //遍历u所连接的点#define cls(a,x)   memset(a,x,sizeof(a)) #define eps 1e-8using namespace std;//const int MOD = 1e9+7;const int INF = 0x3f3f3f3f;const int MAXN = 1e5+5;const int MAXE = 2e5+5;long long MOD = 1e9+7;typedef long long LL;typedef unsigned long long ULL;int T,n,m,k;int fx[] = {0,1,-1,0,0};int fy[] = {0,0,0,-1,1};map<int,int>mp;LL ans ;void input() {    int tmp;    ans = 1;    mp.clear();    rep(i,1,n) {        scanf("%d",&tmp);        mp[tmp]++ ; ans = (ans * (LL)tmp) % MOD;    }}LL quick_pow(LL base , LL mult) {    LL ret = 1;    while(mult) {        if(mult & 1) ret = (ret * base) % MOD;        base = ( base * base ) % MOD;        mult >>= 1;    }    return ret;}void solve() {    LL mult = 1 , ss = 1;    int ok = 0 ;    auto pos = mp.begin();    repS(it,mp) {        if(it->second & 1) { ok = 1; pos = it;}        ss = (ss * quick_pow(it->first,it->second/2)) % MOD;    }    if(ok) {        repS(it,mp) {            if(pos == it) {                ans = quick_pow(ans,(it->second+1)/2);            }            else {                ans = quick_pow(ans,it->second+1);            }        }    }    else {        ans = ss;        repS(it,mp) {            ans = quick_pow(ans,it->second+1);        }    }    printf("%I64d\n",ans);}int main(void) {   // freopen("a.in","r",stdin);    while(~scanf("%d",&n)) {        input();        solve();    }    return 0;}
0 0
原创粉丝点击