Algorithm 对角线以N个正方形通过的不同矩形的数目

Algorithm 对角线以N个正方形通过的不同矩形的数目,algorithm,computer-science,combinatorics,Algorithm,Computer Science,Combinatorics,我正在解决CS问题,不需要什么帮助。我有数字N,我需要计算不同的矩形的数量,如果矩形在大小为1x1的矩形上分割,对角线以N个正方形的形式通过。这张照片会帮助你理解 这张图片显示了所有4种组合,如果N=4,实际上对角线在4个正方形中穿过的矩形的尺寸为1x4、2x3、4x2和4x4 我找到了公式,如果我们给出两个矩形的尺寸,它是: A+B-gcd(A,B) 自Na)互换(a,b); 如果(b==0),则返回a; 返回gcd(b,a%b); } 布尔有效(整数n,整数m,整数gc,整数a){ 如果(

我正在解决CS问题,不需要什么帮助。我有数字N,我需要计算不同的矩形的数量,如果矩形在大小为1x1的矩形上分割,对角线以N个正方形的形式通过。这张照片会帮助你理解

这张图片显示了所有4种组合,如果N=4,实际上对角线在4个正方形中穿过的矩形的尺寸为1x4、2x3、4x2和4x4

我找到了公式,如果我们给出两个矩形的尺寸,它是:

A+B-gcd(A,B)

自Na)互换(a,b); 如果(b==0),则返回a; 返回gcd(b,a%b); } 布尔有效(整数n,整数m,整数gc,整数a){ 如果(n+m-gc==a)返回true; 返回false; } int main(){ cin>>a; int计数器=0;
对于(inti=1;i虽然
O(n*sqrt(n)*log(n))
听起来有点像
n,请显示您的代码。我发布了我的代码。非常感谢您的回答,我更改了您告诉我的所有内容,但我认为最大的问题是,我是以递归方式而不是迭代方式计算GCD。
#include <bits/stdc++.h>

#define ll long long
using namespace std; 
int a;

int gcd(int a, int b) {
    if(b>a) swap(a,b);
    if(b==0) return a;
    return gcd(b, a%b);
}

bool valid(int n, int m, int gc, int a) {
    if(n+m-gc==a) return true;
    return false;
}

int main() {
cin>>a;

int counter=0;
for(int i=1;i<=a/2;i++) {
    for(ll j=1;j<=sqrt(i);j++) {
        if(i%j==0) {
            if(j!=i/j) {
                int m1 = a+j-i;
                int div=i/j;
                int m2 = a+div-i;
                if(valid(i, m1, j, a)) {
                    if(gcd(i, m1)==j)
                        counter++;
                }
                if(valid(i, m2, i/j, a)) {
                    if(gcd(i,m2)==i/j)
                        counter++;
                }

            }
            else {
                int m1 = a+j-i;
                if(valid(i, m1, j, a)) {
                    if(gcd(i, m1)==j)
                        counter++;
                }
            }
        }
    }
}
cout<<counter+1;
return 0;
}
int gcd(int a, int b) {
    if(b>a) swap(a,b);
    if(b==0) return a;
    return gcd(b, a%b);
}
int gcd(int a, int b) {
    while (b) {
        int r = a % b;
        a = b;
        b = r;
    }

    return a;
}
for(int i=1;i<=a/2;i++) {
    for(ll j=1;j<=sqrt(i);j++) {