CFは582 C.ブック読書をDIV3

CFは582 C. DIV3 ブック読書

質問の意味:

、mビットの和の倍数〜N 0を求めるには、二つの数字のn及びm

アイデア:

テーブルをヒット、出力0〜nは、どの機能の複数のMの数と、これらの数字、1ことをすべての10サイクルを見つけるだろう

そして、このサイクルフェスティバル、10以上の最大以上ではない、と確かに数10について、我々は彼のサイクルの長さが10であると仮定します

  • 证明:
    \ [0,1m、2M、3M、4M、5M、6M、7M、8M、9M、クワッド、10M、11M、12M、--- N \\ 0,1,2,3,4,5 \ 、6,7,8,9、\クワッド\カッド\カッド\カッド\カッド\カッド\クワッド、10,11,12 --------- [N / m]で\\ 0,1,2 、3,4,5,6,7,8,9 \クワッド\カッド\カッド\カッド\クワッド、0,1,2、-------- [N / M / 10] \]

このプロパティによると、我々は答えを得るために、その後、サイクルの残りの残党を追加し、サイクル数を乗じ、このサイクルの外祭りを事前にすることができます

コード:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef unsigned long long ULL;
ULL n , m, ans ,k ;
int t;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin >> t;
    while(t--){
        vector<int> v;
        ans = 0;
        cin >> n >> m;
        k = n / m; // m的倍数在 n 的范围中出现的次数
        for(int i = 1;i <= 10; ++i) {  // 求循环节
            int x = i * m % 10;
            ans += x; // 预处理循环节的总和
            v.push_back(i * m % 10);
        }
        ans *= k/10;  // ans当前代表 每个循环节的和,再乘以 k/10 (循环次数),因为每个循环节长度为10,等到循环次数k
        k %= 10; //  最后剩余的 ,不满足 一个循环节的数字
        for(int i = 0;i < k; ++i) ans += v[i]; // 把剩余的数字加上去
        cout << ans;
        if(t != 0) cout << endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/317zhang/p/11466740.html