Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 乘数(合力)_Algorithm_Number Theory - Fatal编程技术网

Algorithm 乘数(合力)

Algorithm 乘数(合力),algorithm,number-theory,Algorithm,Number Theory,这是指向此算法主题的链接: 我的代码时间限制超过了test40,我想了很长时间但没有好办法,有没有好的优化方法,可能 霉菌代码: typedef long ll; ll mod=1e9+7; ll快速模式(ll a、ll n、ll mod) { ll-ans=1; a%=Mod; while(n) { 如果(n&1)ans=(ans*a)%Mod; a=(a*a)%Mod; n> >=1; } 返回ans; } int main() { std::ios::与stdio同步(false); 标准

这是指向此算法主题的链接:

我的代码时间限制超过了test40,我想了很长时间但没有好办法,有没有好的优化方法,可能

霉菌代码:

typedef long ll;
ll mod=1e9+7;
ll快速模式(ll a、ll n、ll mod)
{
ll-ans=1;
a%=Mod;
while(n)
{
如果(n&1)ans=(ans*a)%Mod;
a=(a*a)%Mod;
n> >=1;
}
返回ans;
}
int main()
{
std::ios::与stdio同步(false);
标准::cin.tie(0);//IO
llm;
cin>>m;
ll num=1ll;
地图计数;
for(int i=0;i>p;
计数[p]++;
}
ll res=1ll;
载体a;
载体b;
for(auto it=count.begin();it!=count.end();it++)
{
a、 向后推(它->第一个);
b、 向后推(它->秒);
}
对于(int i=0;icoutN的除数乘积的另一个公式是
N**(D/2)
,其中D是除数的数量,可以从地图
count
中找到,方法是取每个条目的
entry->second+1
的乘积

这确实提出了当
D
是奇数时该怎么办的问题,如果
N
是一个完美的平方,那就是这样。在这种情况下,很容易计算
sqrt(N)
(指数都是偶数,所以你可以将它们减半,并将素数的乘积取为原始指数的一半),然后提高
sqrt(N)
D
的力量。本质上,这将
N**(D/2)
变成
(N**(1/2))**D

例如,如果
N=2*3*2=12
(示例之一),则
D
将是
(2+1)*(1+1)=6
,除数的乘积将是
12**(6/2)=1728


计算
N
(或其平方根)应按模计算
mod
。计算
D
应按模计算
mod-1
mod
mod
的总和是一个素数,因此其总和仅少一个)(
mod-1
是偶数,因此我们不可能通过这种方式计算出2的模乘逆,以将
D
除以2。当
N
是平方时,那么我们就只能计算它的平方根了(这不是很糟糕,但是乘以一半会更容易).

关于
N
的除数乘积的另一个公式是
N**(D/2)
,其中D是除数的数量,可以从地图
count
中找到,方法是为每个条目取
条目->秒+1
的乘积

这确实提出了当
D
是奇数时该怎么办的问题,如果
N
是一个完美的平方,那就是这样。在这种情况下,很容易计算
sqrt(N)
(指数都是偶数,所以你可以将它们减半,并将素数的乘积取为原始指数的一半),然后提高
sqrt(N)
D
的力量。本质上,这将
N**(D/2)
变成
(N**(1/2))**D

例如,如果
N=2*3*2=12
(示例之一),则
D
将是
(2+1)*(1+1)=6
,除数的乘积将是
12**(6/2)=1728


计算
N
(或其平方根)应按模计算
mod
。计算
D
应按模计算
mod-1
mod
mod
的总和是一个素数,因此其总和仅少一个)(
mod-1
是偶数,因此我们不可能通过这种方式计算出2的模乘逆,以将
D
除以2。当
N
是平方时,那么我们就只能计算它的平方根了(这不是很糟糕,但是乘以一半会更容易).

你能描述一下你做了什么吗?我在理解你的方法时遇到了困难。养成评论和记录你的程序代码的习惯。在代码中。(你可能想用你喜欢的答案的编码语言(族)来标记你的问题。)你能描述一下你做了什么吗?我很难理解你的方法到底是什么。养成评论和记录你的程序代码的习惯。在代码中。(你可能想用一种你更喜欢使用的编码语言(族)来标记你的问题。)我一开始也这么想,但我发现它是指数(d)太大,因此在将()的形式更改为((()^)的形式后,似乎超出了test24的时间限制^,这段代码加快了速度,但仍然停留在test40中。@Rchar不是一个大指数吗?毕竟,fast\u mod
在指数中是对数的。如果它仍然很慢,应该还有另一个原因发生这种情况。哦,我搞错了。我一开始也这么想,但我找到了它的指数(D)太大,因此在将()的形式更改为((()^)的形式后,似乎超出了test24的时间限制^,这段代码速度加快了,但仍然停留在test40中。@Rchar不是一个大指数吗?
fast\u mod
在指数中毕竟是对数的。如果它仍然很慢,那么应该还有其他原因导致这种情况发生霍,我搞错了