问题描述
这是该算法主题的链接: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 (将#修改为@)