c++ - x的倍数

标签 c++ algorithm numbers

假设给定一个从l到r的范围,我们被要求找出所有数字都是x的倍数的数字的计数。 x可以是1到9之间的任何数字。例如,取l = 20和r = 40且x = 2,则所需数字为20、22、24、26、28、40,因为x的倍数为0、2、4 ,6,8。
我已经为此写了代码。它针对某些测试用例运行。我不解释为什么大多数测试用例都给出错误答案。
约束:1 <= l <= r <= 10 ^ 18。
我的代码:

  #include<bits/stdc++.h>
 using namespace std;
 #define ll long long int

 ll s1(vector<string> &v, ll N)
 {

ll i, j, n = v.size(), ans = 0;
string ss = "", s = "";

for (i = 0; i < n; i++)
{
    s += v[i];
}
ss = to_string(N);

ll d = ss.length(), f = 0, x = n - 1, y = 1;


for (i = 1; i < d; i++)
{
    if (i == 1)
    {
        ans += x;
        y = x;
        continue;
    }
    y = y * n;
    ans += y;
}
ll z = 0;

for (j = 0; j < d; j++)
{
    f = 0; 

    for (i = 0; i < s.length(); i++)
    {
        if (z == 0)
        {
            z++;
            continue;
        }
        
        if (s[i] < ss[j])
        {

            ans += pow(n, d - (j + 1));
            z++;
        }
        else if (s[i] == ss[j])
        {
            z++;
            f = 1;
            break;
        }
    }
    if (!f)
    {
        break;
    }
}
ans += f;

return and;
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);

int t;
cin >> t;

while (t--)
{
    ll l, r;
    ll k, i, g;

    cin >> l >> r >> k;
    vector<ll> v1;

    ll x = 0;
    while (x <= 9)
    {
        v1.push_back(x);
        x = x + k;
    }

    vector<string> s;

    for (i = 0; i < v1.size(); i++)
    {
        g = v1[i];
        char c = g + '0';
        string d(1, c);
        s.push_back(d);
        //  cout << D[i] << " ";
    }

    cout << s1(s, r) - s1(s, l - 1) << '\n';

}

 }
谁能告诉我这个问题的更好逻辑?

最佳答案

  • 使用动态编程,我们可以编写一个函数f(x,d),该函数为我们提供[0,x]范围内的数量,以便每个数字都是d的倍数
  • dp状态:[position in X][is our number prefix == X prefix?]
  • 将使用log10(X) * 2空间
  • 的起始状态显然是[0][1]
  • 然后我们只需要填充dp表,使用递归尤其容易,在递归中我们只需检查下一个可以添加的数字即可保存所有条件
  • 因此,如果我们删除常量
  • ,则此类dp函数的总复杂度将为O(log10(X) * 2 * 10)或只是O(log N)
  • 然后答案就是f(R,x)-f(L-1,x)

  • 示例代码(C++):
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    
    ll dp[22][2]; //[position in X][is our number prefix == X prefix?]
    
    ll do_dp(vector<int>&digits, int k, int pos = 0, bool isEq = true)
    {
        if(pos >= digits.size())return 1;
        if(dp[pos][isEq] != -1)return dp[pos][isEq];
    
        dp[pos][isEq] = 0;
        for(int d = 0; d <= (isEq ? digits[pos] : 9); d++) //d is next digit
            if(d % k == 0) //multiple of k
            dp[pos][isEq] += do_dp(digits, k, pos+1, isEq && d == digits[pos]);
    
        return dp[pos][isEq];
    }
    
    ll solve(ll x, int k)
    {
        vector<int>digits;
        while(x > 0){
            digits.push_back(x%10);
            x/=10;
        }
        reverse(digits.begin(),digits.end());
        memset(dp, -1, sizeof dp);
        return do_dp(digits, k);
    }
    
    int main()
    {
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        ll t,l,r,k;
        cin>>t;
        while(t--)
        {
            cin>>l>>r>>k;
            cout<<solve(r,k) - solve(l-1,k)<<"\n";
        }
    }
    

    关于c++ - x的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63500469/

    相关文章:

    XMVectorPermute 的 C++ 模板相关错误

    c++ - 如果在 C++ 中有多个继承模板,则非法调用非静态成员函数

    c++ - 如果我在 C/C++ 中定义一个 0 大小的数组会发生什么?

    c++ - 在异步调用中将 shared_ptr 作为参数传递

    java - 在多个工作线程中平衡负载的算法

    php - 为什么 1024 * 1024 * 1024 * 1024 * 1024 返回 float ?

    java - 如何按升序对段数组 (int left, int right) 进行排序,但如果 left(i)=left(i+1) 则根据 right(i) 和 right(i+1) 对其进行排序

    python - 一些静态元素的快速排列

    c++ - Boost C++ 库中 Log 函数的问题

    jQuery:将文本转换为整数(输入值)时出现问题