乘数代码力量

问题描述

这是该算法主题链接https://codeforces.com/problemset/problem/615/D

我的代码在test40上超过了时间限制,想了半天也没有好的办法,有没有好的优化方法,可能是?

我的代码

typedef long long ll;
ll mod = 1e9 + 7;

ll fast_mod(ll a,ll n,ll Mod)
{
    ll ans=1;
    a%=Mod;
    while(n)
    {
        if(n&1) ans=(ans*a)%Mod;
        a=(a*a)%Mod;
        n>>=1;
    }
    return ans;
}

int main()
{
    std::ios::sync_with_stdio(false);    
    std::cin.tie(0);     // IO

    ll m;
    cin >> m;
    ll num = 1ll;
    map<ll,ll> count;
    for(int i = 0; i < m; i++)
    {
        ll p;
        cin >> p;
        count[p]++;
    }
   
   ll res = 1ll;
   vector<ll> a;
   vector<ll> b;
   for(auto it = count.begin(); it != count.end(); it++)
   {
       a.push_back(it -> first);
       b.push_back(it -> second); 
   }
   for(int i = 0; i < a.size(); i++)
   {
       ll x = a[i];  // a kind of prime
       ll y = b[i];  //  the count of the prime
       ll tmp = fast_mod(x,y * (y + 1) / 2,mod);  // x^1 * x^2 * x^3 *...*x^y
       for(int j = 0; j < b.size(); j++)  // calculate  ( tmp)^((b[0] + 1)*(b[1] + 1)*...*(b[b.size() - 1] + 1)),here b.size() is the number of different primes
           tmp = fast_mod(tmp,i != j ? (b[j] + 1) : 1,mod) % mod; 
       res = (res * tmp % mod);
   }

    cout << res << endl;

    return 0;
}

求每个不同素数的个数,假设x是不同素数中的一个,然后计算x^1x^2...x^y,y是x 的计数,结果为 tmp。然后是计数的乘积 其他素数加一作为指数:(b[0] + 1)(b[1] +1)...(b[b.size() - 1] + 1)、以tmp为基准。 for 循环将计算分为几个步骤。 最后, res * (tmp^ ((b[0] + 1)(b[1] +1)...*(b[b.size() - 1] + 1)) )

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)