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
  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4785688.html
Copyright © 2011-2022 走看看