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
原文地址:https://www.cnblogs.com/HarryGuo2012/p/4785688.html