2020-08-16
发布日期:2021-05-13 21:09:26 浏览次数:16 分类:精选文章

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

数论求F(n)

/*

题意:
f(5,1)=4,即5/1=5,5-1=4;
f(8,2)=3,即8/2=4,4-1=3;
f(7,3)=1,即7/3=2,2-1=1;
f(5,4)=0,即5/4=1,1-1=0;
求:
F(n)=f(n,1)+f(n,2)+f(n,3)+…+f(n,n)
=n/1+n/2+…+n/n-n
思路:
n非常大,暴力会超时,找数试找规律,练思维的题
这里先求:n/1+n/2+…+n/n (每个数的结果都是整数,有小数的舍弃小数部分)
例:F(9)=n/1+n/2+n/3+n/4+n/5+n/6+n/7+n/8+n/9
9 4 3 2 1 1 1 1 1
相差 5 1 1 1
5个1,1个2,1个3,1个4
例:F(12)=n/1+n/2+n/3+n/4+n/5+n/6+n/7+n/8+n/9+n/10+n/11+n/12
12 6 4 3 2 2 1 1 1 1 1 1
相差 6 2 1 1
6个1,2个2,1个3,1个4
法1:结论:我们可以先计算后面的,然后再加上前面的
有了这个规律:我们可以写出减少时间短的代码

法2:(不理解)

https://blog.csdn.net/liverpippta/article/details/8216071
*/

/*法1: #include
int main(){ int tt; scanf("%d",&tt); while(tt--) { int n; scanf("%d",&n); long long sum=0;//求:n/1+n/2+...+n/n int x=0;//**总共会有n个数相加,x记录有多少个数相加** int j=1,i,t; for(i=2;;i++)//**从后往前加** { t=n/(i-1)-n/i; if(t==0) break; x+=t; sum+=t*j; j++;//**后面的相邻的不同数之间差1,当差的不是1的时候已跳出循环了** } for(i=1;i<=n-x;i++)//**再加前面的** sum+=n/i; printf("%lld\n",sum-n); } return 0;}*/
/*法2: #include
#include
int main() { int a; scanf("%d",&a); while(a--) { int i,p,t; long long s=0; scanf("%d",&t); p=sqrt(t); for(i=1;i<=p;i++) s+=(t/i); s*=2; s=s-p*p-t; printf("%lld\n",s); } return 0; }*/

//也可用快速密来求,可惜我没有找到代码

上一篇:easy_hard求3的不同幂和的最好数*
下一篇:数论,水题,n进制

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月26日 18时06分52秒