描述
Carryon 最近迷上了数数字,然后 Starry 给了他一个区间 [l, r],然后提了几个要求,
- 需要将 l 到 rr之间的数全部转化成 16 进制,然后连起来。
- 将连起来的数又转化成 10 进制。
- 将最终结果对 15 取模。
数据范围:1<=l<=r<=1000000000000
输入样例
10 14
输出样例
0
复制样例
小提示
如:10、11、12、13、14的16进制分别是a、b、c、d、e。依次连在一起是abcde,转换成10进制是703710,对15取模为0。
思路:起初想到的是直接暴力从r到l连接,每四位二进制取模15。
但是后来突然发现了一个规律——一个数a取模15的值会等于a从后往前每四位取模15的和再取模15;
再后来发现其实完全可以把上面的规律推及到整数之间。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long m,n,ans=0,pre=0,x;
scanf("%lld%lld",&m,&n);
/*for(long long i=n;i>=m;i--)
{
/*if(pre==0) x=i;
else if(pre>=8) x=(i<<4)+pre;
else if(pre>=4) x=(i<<3)+pre;
else if(pre>=2) x=(i<<2)+pre;
else if(pre==1) x=(i<<1)+pre;*//*
x=i+pre;
while(x>15)
{
long long y=x%16;
ans=ans+(y&15);
x=x>>4;
}
pre=x;
ans%=15;
}*/
m%=15;n%=15;
if(m>n) n+=15;
for(long long i=m;i<=n;i++)
{
ans+=i;
}
ans%=15;
printf("%lld\n",ans);
return 0;
}