zoukankan      html  css  js  c++  java
  • TCO 2015 Round 2A DIV1

    ModModMod 傻逼数论

    题意:

    这是一道卖萌的题。。给你一个取模序列$m$,令$f(x)=(cdots (x mod m[0]) mod m[1])mod m[2]cdots $,问你$sum_{i=1}^R f(i)$的值是多少

    题解:

    容易知道一点,若$i<j$且$m[i]le m[j]$,那么$m[j]$就是没有意义的,所以首先将m变成递减序列。接下来观察每次取模后的结果,由于是从1到R,所以序列第一次取模后会变成:

    $$(0+1+2+cdots+m[0]-1)+(0+1+2+cdots+m[0]-1)+cdots+(0+1+2+cdots+m[0]-1)+(0+1+2+cdots+R mod m[0])$$

    其中$0+1+2+cdots+m[0]-1$一共有$R/m[0]$个,由于$f(0)=0$,所以这样就变成了和原问题一样的子问题了,递归求解即可。

    代码:

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    vector<int> v;
    
    long long dfs(int i,int x) {
        if (x == 0)return 0;
        if (i == v.size())return (1 + x) * x / 2;
        return x / v[i] * dfs(i + 1, v[i] - 1) + dfs(i + 1, x % v[i]);
    }
    
    class ModModMod{
    public:
        long long findSum(vector <int> m, int R){
            v.push_back(m[0]);
            for(int i=1;i<m.size();i++)
                if(v[v.size()-1]>m[i])
                    v.push_back(m[i]);
            return dfs(0,R);
        }
    };
    View Code
  • 相关阅读:
    判断质数
    猜拳三局两胜
    输入年月日判断是这一年的哪一天
    switch case
    猜拳
    判断年月日是否正确
    老狼老狼几点了
    判断是否中奖
    平滑部署war包到tomcat-deploy.sh
    只用120行Java代码写一个自己的区块链-3挖矿算法
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4785688.html
Copyright © 2011-2022 走看看