C++ 找到可被1到N之间的所有数整除的最小数,余数=0
求出可被1到N的所有数整除的最小数,不留余数。因为这个数字可能很大,所以我们取模100000007的答案 我认为可以被从1到N的所有数整除的最小数是LCM(1..N) 例如:对于N=5,最小的数字是60 As 60是可被所有数字形式(1-5)整除的最小数字 但由于某种奇怪的原因,它给了我错误的答案,比如大N(1000),等等。 什么会导致这里可能的错误,我在这里的登录正确吗 以下是我试图实现的C++ 找到可被1到N之间的所有数整除的最小数,余数=0,c++,algorithm,C++,Algorithm,求出可被1到N的所有数整除的最小数,不留余数。因为这个数字可能很大,所以我们取模100000007的答案 我认为可以被从1到N的所有数整除的最小数是LCM(1..N) 例如:对于N=5,最小的数字是60 As 60是可被所有数字形式(1-5)整除的最小数字 但由于某种奇怪的原因,它给了我错误的答案,比如大N(1000),等等。 什么会导致这里可能的错误,我在这里的登录正确吗 以下是我试图实现的 #include <iostream> #include <vector> u
#include <iostream>
#include <vector>
using namespace std;
vector<long long> lcmArr;
const long long mod = 1000000007;
long long gcd(long long a, long long b){
if(b == 0)
{
return a;
}
return gcd(b, a%b);
}
long long lcmFumction(long long a, long long b)
{
return (a*b)/gcd(a,b);
}
int main() {
lcmArr.clear();lcmArr.resize(1002);
lcmArr[0] =0; lcmArr[1] = 1;
for(int i =2; i <=1000; i++){
lcmArr[i] = lcmFumction(lcmArr[i-1], i)%mod;
//cout<<lcmArr[i-1]<<" ";
}
int T;
cin >> T;
while(T--) {
int N;
cin>>N;
cout<<lcmArr[N]<<"\n";
}
return 0;
}
#包括
#包括
使用名称空间std;
向量lcmArr;
常数长模=100000007;
长-长gcd(长-长a,长-长b){
如果(b==0)
{
返回a;
}
返回gcd(b,a%b);
}
长-长LCM动作(长-长a,长-长b)
{
报税表(a*b)/gcd(a、b);
}
int main(){
lcmArr.clear();lcmArr.resize(1002);
lcmArr[0]=0;lcmArr[1]=1;
对于(int i=2;i问题是,当计算LCM时,使用除法
及
例如(10/5/2)%2!=((10/5)%2)/2)%2
你应该用它来计算
关于模逆的一些解释
如果我们有:
(a*b)%m=1
,则b
是a
的模逆,如b%m=(1/a)%m
因此,如果我们需要计算(x/a)%m
,我们可以将其变成(x*b)%m
我们知道,(A*B*C)%m=((A*B)%m)*C) %m
,因此,在您的情况下,模逆将派上用场。我知道上面的答案已经被接受,但我认为这不足以解决您的问题。问题在于,第一个模LCM将带走您在后续GCD调用中需要检查的所有除数,因此答案仍然是错误的
一个可能的解决办法是保持一个数组的因子,每个因子都是1个…的每个数,除以GCD(数字,[所有以前的数字])。为了工作,你必须编写一个特殊的GCD,计算单个数和一个因子数组之间的结果。这个C++代码显示了这将如何工作:
#include <iostream>
#include <vector>
#define lli long long int
using namespace std;
vector<lli> T;
lli gcd(lli a, lli b) {
if(b == 0)
return a;
return gcd(b, a%b);
}
lli gcd_vector(vector<lli>& a, lli b) {
lli ma = 1;
for(int i=0; i<T.size(); i++)
ma = ma*T[i]%b;
return gcd(b, ma);
}
int main() {
lli answer = 1;
for(int i=1; i<=1000; i++) {
lli factor = i/gcd_vector(T, i);
T.push_back(factor);
answer = (answer*factor)%1000000007;
}
cout << answer << endl;
}
#包括
#包括
#定义lli长整型
使用名称空间std;
向量T;
lli gcd(lli a,lli b){
如果(b==0)
返回a;
返回gcd(b,a%b);
}
lli gcd_向量(向量a、lli b){
lli-ma=1;
对于(int i=0;ILookes像C++),但我可能错了。请用你正在使用的语言标记问题。这应该是POST to @ @ @宇辰:否。代码审查是为了要求改进工作代码(或者显然是工作代码)。。我认为这对这个问题可能也很有用,似乎这个问题已经出现了好几次:谢谢你的回答,我想我明白你在这里想说什么,但我不知道这里应该编辑什么来确保模块计算正确。谢谢你,我真的很感激。@user3232918 glad有帮助:)
#include <iostream>
#include <vector>
#define lli long long int
using namespace std;
vector<lli> T;
lli gcd(lli a, lli b) {
if(b == 0)
return a;
return gcd(b, a%b);
}
lli gcd_vector(vector<lli>& a, lli b) {
lli ma = 1;
for(int i=0; i<T.size(); i++)
ma = ma*T[i]%b;
return gcd(b, ma);
}
int main() {
lli answer = 1;
for(int i=1; i<=1000; i++) {
lli factor = i/gcd_vector(T, i);
T.push_back(factor);
answer = (answer*factor)%1000000007;
}
cout << answer << endl;
}