zoukankan      html  css  js  c++  java
  • hdu 4944 FSF’s game(数论)

    题目链接:hdu 4944 FSF’s game

    题目大意:给定N,能够用不大于N的长a和宽b。组成N(N1)2种不同的矩形,对于每一个矩形ab要计算它的值,K为矩形a,b能够拆分成若干个KK的正方形。abgcd(a/k,b/k),输出全部矩形值的和。

    解题思路:如果有边a和b。那么k肯定即使a的因子也是b的因子。

    定义f(n)为矩形最长边等于n的情况下全部矩形值的和。那么f(n)=val(1n)+val(2n)++val(nn),枚举n的因子作为k,如今如果有因子k,使得n=ka:
    g(k)=1knk+2knk++aknk

    =1n+2n++an

    =(1+a)a2n

    f(n)=g(k)(k为n的因子)
    然后用类似素数筛选法的方式处理处f(i)的值。相应再累加即使答案。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    typedef unsigned long long ll;
    const ll MOD = 1LL<<32;
    const int maxn = 500000;
    
    ll f[maxn+5], s[maxn+5];
    
    void init () {
        memset(f, 0, sizeof(f));
    
        s[0] = f[1] = 0;
        for (int i = 1; i <= maxn; i++) {
    
            for (int k = 1; k * i <= maxn; k++) {
                f[k*i] += (1LL + k) * k / 2;
                f[k*i] %= MOD;
            }
            f[i] = f[i] * i % MOD;
        }
    
        for (ll i = 1; i <= maxn; i++)
            s[i] = (s[i-1] + f[i]) % MOD;
    }
    
    int main () {
        init();
        int cas, n;
        scanf("%d", &cas);
        for (int kcas = 1; kcas <= cas; kcas++) {
            scanf("%d", &n);
            printf("Case #%d: %I64u
    ", kcas, s[n]);
            //printf("Case #%d: %lld
    ", kcas, s[n]);
        }
        return 0;
    }

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    someThink
    快捷键
    typedef 的本质
    读取配置文件
    stl file
    摘自CSDNhttp://blog.csdn.net/gnuhpc/archive/2009/11/13/4808405.aspx
    thread demo
    B/S和C/S区别 java程序员
    上传文件 java程序员
    (八)VS的操作和使用技巧 java程序员
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4610630.html
Copyright © 2011-2022 走看看