zoukankan      html  css  js  c++  java
  • CF div3 582 C. Book Reading

    CF div3 582 C. Book Reading

    题意:

    给两个数字 n 和 m ,求0 ~ n 中,m的倍数 的 个位 之和

    思路:

    先打表,输出 0 ~ n 中,m的倍数 的 个数有什么特点,然后就会发现,这些数字,每 10 个 一循环

    且这个循环节,最大不超过 10 ,并且肯定是 10 约数,那么,我们就假定他的循环长度为 10

    • 证明:

    [ 0,1m,2m,3m,4m,5m,6m,7m,8m,9m,quad,10m,11m,12m,---n\ 0,1,2,3,4,5,6,7,8,9,quadquadquadquadquadquadquad,10,11,12---------[n/m]\ 0,1,2,3,4,5,6,7,8,9quadquadquadquadquad,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;
    }
    
  • 相关阅读:
    mysql面试知识点
    计算机网络
    BFS
    拓扑排序
    双指针
    回溯算法
    hash表 算法模板和相关题目
    桶排序及其应用
    滑动窗口
    贪心算法
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/11466740.html
Copyright © 2011-2022 走看看