第一题和第二题基本都是签到题,就直接做就可以了,直接就水过去了…
第三题(math problem):
链接:https://ac.nowcoder.com/acm/contest/893/C
已知整数a的三次除192的余数是1。求区间[L,R]之间满足条件的a的累加和是多少?
就如题目所说一样,这是一个数学问题,虽然当时没有证明出来(抖机灵拿笔算了一下发现只需要a除192的余数是1那么a的三次就一定满足,然后华丽水过去了)
现在我们来小小的证明一下:
(而且我也不会说这个是小学奥数比赛的题目)
即只需要a除192的余数是1那么a的三次就一定满足条件,然后等差数列求和即可。
证明如下:
因为 我们由题目可以知道:
而
我们分解过后由a(a+1)+1可知,一定为奇数,而64怎么分解都为偶数,
所以,当我们取余的时候,我们可以发现
原式可以化为
同理,我们由数学定理及其类似的方法有:
而
所以综上
所以得证:
然后给出我的代码:
(刚开始TLE了几发)
#include<iostream>
using namespace std;
int main()
{
int n,l,r,k;
long long cnt,sum,temp,first;
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
temp=0;
cnt=0;
sum=0;
scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++)
{
if(j%192==1)
{
temp=j;
break;
}
}
first=temp;
if(first!=0)
{
k=(r-first)/192+1;
if(k>=1)
sum=k;
}
cnt=first*sum+96*sum*(sum-1);
printf("%lld\n",cnt);
}
}
return 0;
}
然后是给的标程:
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll l,r;
cin>>l>>r;
ll a,b,sum=0;
while(l%192!=1)
l++;
a=l;
a=(a-1)/192;
while(r%192!=1)
r--;
b=r;
b=(b-1)/192;
sum=(l+r)*(b-a+1)/2;
cout<<sum<<endl;
}
}
giao辞呜呜呜