For two integers m and k, k is said to be a container of m if k is divisible by m. Given 2 positive integers n and m (m < n), the function f(n, m) is defined to be the number of containers of m which are also no greater than n. For example, f(5, 1)=4, f(8, 2)=3, f(7, 3)=1, f(5, 4)=0...
Let us define another function F(n) by the following equation:
Input
There are multiple test cases. The first line of input contains an integer T(T<=200) indicating the number of test cases. Then Ttest cases follow.
Each test case contains a positive integer n (0 < n <= 2000000000) in a single line.
Output
For each test case, output the result F(n) in a single line.
Sample Input
2 1 4
Sample Output
04
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3216
本质就是求(n/1+n/2+...+n/n-1)-n的值
数字太大,不能用n/2,只能用平方根(这个在比赛的时候完全想不到。。)
推导过程:比如 n=10
=1*10
=2*5
=3*3
10-5=5,5-3=2
然后我们又惊奇地发现最后的结果10,5,3,2,2,1,1,1,1,1
1有5个,2有2个,于是找到规律。
但是对于像8这样的数字来说,还有两个数字没有赋值到,于是sum+=未赋值个数*当前的b
其他方法:http://blog.csdn.net/zxy_snow/article/details/6159956
#include<iostream> #include<algorithm> #include<string> #include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0}; #include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;} #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #define mod 1000000007 #define ll long long #define sd(x) scanf("%d",&x) #define sd2(x,y) scanf("%d%d",&x,&y) #define fr1(x) freopen("1.txt","r",stdin) #define fr2(x) freopen("2.txt","w",stdout) using namespace std; int main(){ int t,cnt=0; cin>>t; while(t--){ ll n,s=0; cin>>n; ll p=0; for(int i=1;i*i<=n;++i){ s+=n/i-1; s+=p*(n/i-n/(i+1)); if(n/i-1<=p) s-=p*(n/i-n/(i+1)); p++; } cout<<s<<endl; } return 0; }
int main(){ int t; cin>>t; while(t--){ ll n; cin>>n; ll s=0; ll a=n,b=1,c=1; for(ll i=2;i*i<=n;++i){ s+=n/i+(a-n/i)*b; c+=a-(n/i)+1; b++; a=n/i; } s+=(n-c)*b; cout<<s<<endl; } return 0; }