我们如何编写代码来找到以下解决方案: (N + 1)* X = LCM(1,2,3,4,5,6,......,N,N + 1)当它大于(10 ^ 9 + 7)时使用mod。使用MOD =(10 ^ 9 +7)。 我写过以下代码片段,但它不起作用:
ll dp[100005];
ll gcd (ll a,ll b)
{
if (b == 0)
return a;
else
return gcd (b, a % b);
}
void extend_euclid(int a,int b,int &x,int &y)
{
if(a==0)
{
x=0;y=1;
return;
}
int x1,y1;
extend_euclid(b%a,a,x1,y1);
x=y1-(b/a)*x1;
y=x1;
}
void init()
{
dp[1]=1;
for(ll i=2;i<100002;i++)
{
ll x,y;
x=dp[i-1]*i;
x=x%mod;
y=gcd(i,dp[i-1]);
y=y%mod;
int z1,z2;
extend_euclid(y,mod,z1,z2);
y=(z1+mod)%mod;
dp[i]=(y*x)%mod;
}
}
答案 0 :(得分:0)
我认为这是你的问题(如果我错了,请纠正我):
当N * X = LCM(1 - > N)(mod 1E9 +7)时找到X
首先,得到LCM(1 - > N),然后除以N。
不是计算每个数字的最小值的LCM,而是可以查看每个素数≤N并取最大指数≤N,将它们相乘。 因此,如果N = 20,你需要:16(2 ^ 4),9(3 ^ 2),5,7,11,13,19。将它们相乘,得到232792560,等于LCM(1 - &gt; 20)。
有了这个,N总是分成LCM(1-> N),(我会让你解决原因)并找到X很容易。
现在,您会注意到N = 23,您必须(mod 1E9 +7)并且您的LCM(1-> 23)不能被23整除。 你能澄清一下这个问题需要什么吗?你必须找到一个等于LCM(1&gt; 23)的X * N(mod 1E9 +7)??