今天题目看来看去都觉得不可以做啊,数论弱到不堪直视
分为2个部分,对于n>k部分直接n*(n-k)
对于n<=k部分,x%i=x-(x/i)*i,这样就可以枚举商,然后分段加起来。。
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x) for(edge *j=h[x];j;j=j->next) 5 #define mem(a) memset(a,0,sizeof(a)) 6 #define inf 1e9 7 #define ll long long 8 #define succ(x) (1<<x) 9 using namespace std; 10 ll read(){ 11 ll x=0,f=1;char ch=getchar(); 12 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 13 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 14 return x*f; 15 } 16 ll n,k,t,ans; 17 int main(){ 18 freopen("data.in","r",stdin); 19 n=read();k=read(); 20 if(k<n){ 21 ans=(ll)k*(n-k);n=k; 22 } 23 for(int i=1;i<=n;i=t+1){ 24 t=k/i;t=k/t; 25 if(t>n)t=n; 26 ans+=(ll)k*(t-i+1)-(k/i)*(t-i+1)*(i+t)/2; 27 } 28 printf("%lld",ans); 29 return 0; 30 }