A题:
XTU 1203 A simple problem
第一次碰见这种卡常数的题。。。。。
刚开始用的long long发现还是不够,然后找了个大数模板
接下来就无限TLE,然后各种优化。。。。。
总结了下大数运算的几个优化要点
一、能不能大数的地方尽量少用大数
二、大数的数组开到够用就行,不要开太大
还有就是这道题的一个优化,暴力求前半部分的时候,可以把临界的数适当取大一点
/*
* Author: lj94093
* Created Time: 2015/5/27 星期三 下午 5:30:26
* File Name: A simple problem.cpp
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define out(x) cout<<#x<<": "<<x<<endl
const double eps(1e-8);
const int maxn=10100;
const long long inf=-1u>>1;
typedef long long ll;
ll n;
struct BigInt{
const static int mod=10000;
const static int DLEN=4;
int a[8],len;
BigInt(){
memset(a,0,sizeof(a));
len=1;
}
BigInt(ll v){
memset(a,0,sizeof(a));
len=0;
do{
a[len++]=v%mod;
v/=mod;
}while(v);
}
BigInt operator +(const BigInt &b)const{
BigInt res;
res.len=max(len,b.len);
for(int i=0;i<=res.len;i++) res.a[i]=0;
for(int i=0;i<res.len;i++) {
res.a[i] += ((i < len)?a[i]:0)+((i < b.len)?b.a[i]:0);
res.a[i+1] += res.a[i]/mod;
res.a[i] %= mod;
}
if(res.a[res.len]>0) res.len++;
return res;
}
BigInt operator *(const BigInt &b)const{
BigInt res;
for(int i=0;i<len;i++){
int up=0;
for(int j=0;j<b.len;j++){
int tmp=a[i]*b.a[j]+res.a[i+j]+up;//i位*j位,至少有i+j位
res.a[i+j]=tmp%mod;
up=tmp/mod;
}
if(up!=0){
res.a[i+b.len]=up;
}
}
res.len=len+b.len;
while(res.a[res.len-1]==0 && res.len>1) res.len--;//调整长度
return res;
}
void output(){
printf("%d",a[len-1]);
for(ll i=len-2;i>=0;i--) {
printf("%04d",a[i]);//中间的显示前导0
}
printf("\n");
}
};
int t,cas=1;
void init() {
scanf("%I64d",&n);
}
void work() {
BigInt ans=0;
//ll ans1=0;
int tmp;
ll i;
ll m=sqrt(n*1.0);
if(m*10<=n) m=m*10;
ll s=0;
for(i=1;i<=m;i++){
s+=n%i;
tmp=i;
}
ans=ans+s;
ll k=n/(tmp+1),l,r,cnt1,cnt2;
for(l=tmp+1;k!=0;k--,l=r+1){
r=n/k;
cnt1=(n%l)/k;
cnt2=cnt1+1;
ans=ans+BigInt((n%r)*cnt2);
//printf("%I64d %I64d\n",n%r,cnt2);
if(cnt1&1) cnt2>>=1;
else cnt1>>=1;
ans=ans+BigInt(k*cnt1)*BigInt(cnt2);
}
printf("Case %d: ",cas++);
ans.output();
/*ll ans1=0;
for(ll i=1;i<=n;i++){
ans1+=n%i;
}
printf("Case %d: %I64d\n",cas++,ans1);*/
}
int main() {
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
scanf("%d",&t);
while(t--){
init();
work();
}
return 0;
}
原文地址:http://blog.csdn.net/lj94093/article/details/46116097