SRM 596 DIV2

250pt:

直接枚举跳过的位置求和即可。

int n,m; 

int ABS(int a) 

{ 

    if (a < 0) return (-a); 

    else return a; 

} 

class FoxAndSightseeing 

{ 

        public: 

        int getMin(vector <int> p) 

        { 

            n = p.size(); 

            int ans = 0; 

            for (int i = 1; i < n - 1; ++i) 

            { 

                int s = p[0]; 

                int tmp = 0; 

                for (int j = 1; j < n; ++j) 

                { 

                    if (j == i) continue; 

                    tmp += ABS(p[j] - s); 

                    s = p[j]; 

                } 

                if (ans == 0 || ans > tmp) ans = tmp; 

            } 

            return ans; 

        } 





}; 
View Code

 

500pt:

很简单的O(n^2)的DP:

const int inf = 0x7fffffff; 

int n,m; 

int dp[N]; 

bool isok(char a, char b) 

{ 

    if ((a == 'R' && b == 'G') || (a == 'G' && b == 'B') || (a == 'B' && b == 'R')) return true; 

    return false; 

} 



class ColorfulRoad 

{ 

        public: 

        int getMin(string road) 

        { 

            n = road.size(); 

            for (int i = 0; i < n; ++i) dp[i] = inf; 

            dp[0] = 0; 

            for (int i = 1; i < n; ++i) 

            { 

                for (int j = 0; j < i; ++j) 

                { 

                    if (isok(road[j],road[i]) && dp[j] != inf) 

                    { 

                        dp[i] = min(dp[i],dp[j] + (i - j)*(i - j)); 

                    } 

                } 

            } 

            if (dp[n - 1] == inf) return -1; 

            else return dp[n - 1]; 

        } 





}; 
View Code

 

1000pt:

题意:

F(n) = (n - 0^2) * (n - 1^2) * (n - 2^2) * (n - 3^2) * ... * (n - k^2), k满足n - k^2 > 0
然后给出lo,hi,p, 求lo到hi之间的i满足f(i)%p == 0的个数
lo,div取值为[1,10^12];

思路:
比赛的时候想的很乱没写出来,后来想了想当时的思路是错的。无语.....

http://codeforces.com/blog/entry/9405?locale=en   CF有人讨论了这道题目,一看就明白了。  哎....没有想到啊。

我大体说一下思路:
f(n)如果能被p整出,那么f(n)中肯定存在(n - i^2)%p == 0.   i*i < 10^12  那么i <10^6; 

又有n%p == i^2 % p;  ---> n = i^2 + k*p,  i^2 + k*p < A  所以如果求[1,A]中满足的个数的话,那么其值就为(A - i^2)/p;   如果我们单纯枚举的话求值的话中间会有重复计算的j^2%p = i^2%p;  所以我们利用set记录一下重复的然后计算即可。

ll getSum(ll A, ll p)

{

    set<ll> mods;

    ll ans = 0;

    for (ll i = 0LL; i * i < A; ++i)

    {

        if (mods.find((i*i % p)) != mods.end()) continue;

        mods.insert(i*i % p);

        ans += (A - i * i)/p;

    }

    return ans;

}

class SparseFactorialDiv2

{

    public:

    long long getCount(long long lo, long long hi, long long d)

    {

        return getSum(hi, d) - getSum(lo - 1, d);

    }



};

  

 

 

你可能感兴趣的:(div)