Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
C++ 找到可被1到N之间的所有数整除的最小数,余数=0_C++_Algorithm - Fatal编程技术网

C++ 找到可被1到N之间的所有数整除的最小数,余数=0

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

求出可被1到N的所有数整除的最小数,不留余数。因为这个数字可能很大,所以我们取模100000007的答案

我认为可以被从1到N的所有数整除的最小数是LCM(1..N)

例如:对于N=5,最小的数字是60

As 60是可被所有数字形式(1-5)整除的最小数字

但由于某种奇怪的原因,它给了我错误的答案,比如大N(1000),等等。 什么会导致这里可能的错误,我在这里的登录正确吗

以下是我试图实现的

#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;
}