2018 Multi-University Training Contest 1 G(Chiaki Sequence Revisited)

Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤105), indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤1018).
 

Output
For each test case, output an integer denoting the answer.
 

Sample Input
10
1
2
3
4
5
6
7
8
9
10
 

Sample Output
1
2
4
6
9
13
17
21
26
32
题意:就是求a[i]的前缀和

思路:先打表就能发现很明显的规律,就是一个数n如果有k个2做因子,那么将按顺序有k+1个n在表上出现(1是特殊)

比如1,1,2,2,3,4,4,4,5,6,6,7,8,8,8,8,9,10,10,11,,,,

那么设f(n)表示n!里以多少个2位因子,那么i=f(n)+n+1,那个1是首位的1,n是没一个数+1。其中公式求f(n)=(n/2)+(n/4)+(n/8)+...

此时发现如果一直i可以通过二分确定n。然后第二步,ans=1*(1+2+3+...n)+2*(1+2+3+...n/2)+4*(1+2+3+...n/4)。

其实可以发现1,3,5,7...这些数被加了一次,2*1,2*3,2*5...这些数被加了两次,一次类推就得出上述公式了。

这个规律我和队友合作推出来了,但是题目对时间卡的比较紧,没能当场优化出来很遗憾。下次努力。

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define mo 1000000007
using namespace std;
typedef long long ll;
long long acm ;
inline ll read ()
{
    register ll c = getchar() , fg = 1,sum = 0 ;
    while ( c > '9' || c < '0' )
    {
        if( c == '-' ) fg = -1 ;
        c = getchar() ;
    }
    while ( c <= '9' && c >= '0' )
    {
        sum = sum * 10 + c - '0' ;
        c = getchar() ;
    }
    return fg * sum ;
}
int a [ 1010 ], sum [ 1010 ] ;
long long getnum ( long long n ) {
    long long num = 0 ;
    long long nn = n ;
    while ( nn ) {
        num += nn / 2 ;
        nn >>= 1 ;
    }
    return num + n + 1 ;
}
long long qpow ( long long a , long long b )
{
    long long ans = 1 ;
    a = a % mo;
    while ( b ){
        if ( b & 1 ) ans = ans * a % mo ;
        a = a * a % mo ;
        b >>= 1 ;
    }
    return ans;
}
long long getb ( long long x )
{
    x=x%mo;
    return ( x + ( ( x * ( x - 1 ) ) %mo * acm ) + mo ) % mo;
}
long long getans ( long long n ) {
    long long ans = 0 ;
    long long temp = 1 ;
    long long fun = 2 ;
    while ( n )
    {
        ans = ( ans + ( temp % mo ) * ( getb ( n ) % mo ) ) % mo ;
        n /= fun ;
        temp <<= 1 ;
    }
    return ( ans + 1 + mo ) % mo;
}
long long solve ( long long n )
{
    long long l = 1 , r =  n;
    long long fun , mid , fuck , ans ;
    while ( l <= r )
    {
        mid = ( l + r ) >> 1 ;
        if ( getnum ( mid ) <= n )
        {
            if ( getnum( mid + 1 ) > n )
            {
                fun = mid ;
                break ;
            }
            else
            {
                l = mid ;
            }
        }
        else
        {
            r = mid ;
        }
    }

    fuck = getnum ( fun ) ;
    ans = ( getans ( fun ) + ( ( ( n - fuck ) % mo ) * ( ( fun + 1 ) % mo ) ) % mo + mo ) % mo ;
    return ans ;
}
int main(){

    long long n;
    int t;
    a [ 1 ] = 1 ;
    a [ 2 ] = 1 ;
    sum [ 1 ] = 1 ;
    sum [ 2 ] = 2 ;
    for(int i = 3 ; i <= 1000 ; i++ ) {
        a [ i ] = ( a [ i - a [ i - 1 ] ] + a [ i - 1 - a [ i - 2 ] ] ) ;
        sum [ i ] = ( sum [ i - 1 ] + a [ i ] ) ;
    }
    n =2 ;
    acm = qpow ( n , mo - 2 ) ;//这个地方一定要预处理,否则会被卡
    scanf ( "%d" , &t ) ;
    while ( t-- ) {
        n = read() ;
        if (n <= 1000 ) {
            printf ( "%d\n", sum [ n ] ) ;
        }
        else
        {
            printf ( "%lld\n" , solve ( n ) ) ;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值