博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数学水题】【TOJ4113】【 Determine X】
阅读量:6574 次
发布时间:2019-06-24

本文共 1368 字,大约阅读时间需要 4 分钟。

题目大意:

yuebai has a long sequence of integers A1,A2,,AN.

He also has such a function:

F(x)=i=1N(Aix+Aimodx)
x is a positive integer, which determined by yuebai.
Now he wants to know the minimum value of the function.

求一个x 使F[x]最大

解:

从1枚举到10^6

可知 当X超过10^6 方后 值就不变了

SB了

以为能快速求出的是sigma(Aimodx)。。。

发现 傻逼了 能快速求出的事 sigma(Aimodx)modx。。

预处理好a[i] 表示 A[i]中数值小于i的个数

以N/X的时间求出sigmafloor((Ai/x));

然后利用sigmafloor((Ai/x))+sigma(Aimodx)=sigma(Ai) 求出 sigma(Aimodx)

然后更新答案

代码如下:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define oo 0x13131313using namespace std;const int maxn=1000000+5;int N;int A[maxn],a[maxn];int MAX;long long sum=0;void input(){ memset(A,0,sizeof(A)); memset(a,0,sizeof(a)); cin>>N; MAX=-1; sum=0; for(int i=1;i<=N;i++) { scanf("%d",&A[i]); a[A[i]]++; if(A[i]>MAX) MAX=A[i]; sum+=A[i]; } for(int i=1;i<=MAX;i++) { a[i]=a[i]+a[i-1]; }}void solve(){ long long ans=1LL<<30; long long tt=0,g; for(int i=1;i<=MAX;i++) { int x=i;tt=0; for(int t=2*x;t-1<=MAX;t+=x) { int p=t-1; long long k=(long long)(a[p]-a[p-x])*(long long)(p/x); tt=tt+k; g=p; } tt=tt+(long long)(a[MAX]-a[g])*(long long)(MAX/x); tt=tt+sum-tt*(long long)x; if(tt
>T; while(T--) { input(); solve(); }}

转载于:https://www.cnblogs.com/zy691357966/p/5480336.html

你可能感兴趣的文章
python爬虫入门—统计豆瓣电影评论词频
查看>>
mysql由于server-id相同而造成同步失败
查看>>
【LoadRunner技术讲座4】利用sitescope监测监控mysql
查看>>
IEnumerable中运用yield
查看>>
python 时间转换(day,hous,minute,second)
查看>>
网络布线线材用量计算公式
查看>>
查询当前数据库用户会话信息
查看>>
创建触发器的基本语法
查看>>
2015.1.15 利用Oracle函数返回表结果 重大技术进步!
查看>>
2015.3.2 VC++6制作非MFC dll以及VS2005、VS2010调用
查看>>
转:模态对话框的支持 (IE,Firefox,Chrome)
查看>>
让您的电脑在任意目录可以支持图片的粘贴,试试看呗~
查看>>
Jenkins+QTP自动化测试框架
查看>>
《Node.js In Action》笔记之流程控制
查看>>
C++类和对象
查看>>
3518EV200 SDK学习1
查看>>
JavaScript初学者应注意的七个细节
查看>>
1163: 零起点学算法70——Yes,I can!
查看>>
zookeeper原理及作用
查看>>
[ZJOI2015]诸神眷顾的幻想乡
查看>>