zoukankan      html  css  js  c++  java
  • HDU 4834 JZP Set(数论+递推)(2014年百度之星程序设计大赛

    Problem Description
    一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S。
    例如,n=3,S={1,3}不是JZP集,因为(1+3)/2=2不属于S。但是{1,2,3}的其他子集都属于S,所以n=3时有7个JZP集
    给定n,求JZP集的个数。
     
    Input
    第一行为T,表示输入数据组数。
    每组数据包含一行整数n。

    限制条件
    1<=T<=10^5
    1<=n<=10^7
     
    Output
    对第i组数据,输出
    Case #i:
    然后输出JZP集的个数。
     
    题目大意:略。
    思路:考虑到n高达10^7,而T也不小,选择递推预处理出所有答案。
    观察(x+y)/2,对集合里的每个数都有这种规律的话,能想到类似的东西就是等差数列。
    令ans[i]代表集合[1..i]的JZP子集(空集也算的),那么有ans[i] = ans[i - 1] + count(包含i的[1..i]的JZP子集)。
    那么令p[i] = 包含i的[1..i]的JZP子集个数。考虑包含i的等差数列,可以发现等差一定为奇数(偶数都无法构成JZP集合,手动试一下就能发现了)。
    首先p[i]有只包含一个数的{i}。
    之后对于元素个数大于等于2的,等差为1的子集个数为(i-1)/1,等差为3的子集个数为(i-1)/3……
    但是这还不能满足题目的要求。
    考虑p[i]-1和p[i-1]-1的区别,对于(i-1)/1+(i-1)/3+(i-1)/5……和(i-2)/1+(i-2)/3+(i-2)/5……,对于分母为x的,(i-1) / x > (i-2) / x当且仅当(i-1)是x的倍数
    可以得出p[i]比p[i-1]要大count(i-1的奇数约数)。
    对于每个数的约数个数,可以在O(nlogn)的时间里预处理出来(参考素数的筛法)。
    然后递推ans[i] = ans[i - 1] + p[i],至此题目完美解决!
     
    代码(2109MS):
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 #include <queue>
     6 using namespace std;
     7 typedef long long LL;
     8 
     9 const int MAXN = 1e7 + 10;
    10 
    11 int cnt[MAXN];
    12 LL ans[MAXN];
    13 
    14 void initc() {
    15     int n = 1e7;
    16     for(int i = 1; i <= n; i += 2) {
    17         for(int j = i; j <= n; j += i) cnt[j]++;
    18     }
    19 }
    20 
    21 void init() {
    22     initc();
    23     int n = 1e7;
    24     ans[1] = 2;
    25     LL t = 0;
    26     for(int i = 2; i <= n; ++i) {
    27         t += cnt[i - 1];
    28         ans[i] = ans[i - 1] + t + 1;
    29     }
    30 }
    31 
    32 int main() {
    33     init();
    34     int T, n;
    35     scanf("%d", &T);
    36     for(int t = 1; t <= T; ++t) {
    37         scanf("%d", &n);
    38         printf("Case #%d:
    ", t);
    39         printf("%I64d
    ", ans[n]);
    40     }
    41 }
    View Code
  • 相关阅读:
    同步的原则
    我心中的final
    令人"哇"的内部类(一)内部类的设计意义
    令人"哇"的内部类(三)嵌套类
    共享资源问题的解决方案(一)加锁机制
    令人"哇"的内部类(二 )内部类访问外围类
    volatile关键字
    同步控制块
    高质量C++/C 编程指南一
    5、数据表的创建与更新(续)
  • 原文地址:https://www.cnblogs.com/oyking/p/3751608.html
Copyright © 2011-2022 走看看