您的位置:首页 > 其它

【数学】【模拟】XMU 1044 伪伪随机数产生器

2016-07-14 10:28 375 查看
[b]题目链接:[/b]

  [b][b][b]http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1044[/b][/b][/b]

[b]题目大意:[/b]

  求首项为0,公比为x的等差数列组成的数字条的第y位数字是几。(x,y<=2*109)

[b]题目思路:[/b]

  【数学】【模拟】

  万万没想到这道题暴力我就过了。

  0ms是计算在x为公差的情况下每位数会有几个数列中的数(例如x=3,369121518...一位数就有3个)

  直接计算第y个数字是包含在几位数的等差数列中,是第几个数字。

暴力:

//
//by coolxxx
//
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define eps (1e-8)
#define J 10000000
#define MAX 0x7f7f7f7f
#define PI 3.1415926535897
#define N 104
using namespace std;
typedef long long LL;
LL cas,cass;
LL n,m,lll,ans;
LL s[24];
LL x;
int main()
{
#ifndef ONLINE_JUDGE
//    freopen("1.txt","r",stdin);
//    freopen("2.txt","w",stdout);
#endif
LL i,j;
//    for(scanf("%d",&cas);cas;cas--)
//    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
//    while(~scanf("%s",s))
while(~scanf("%lld",&n))
{
scanf("%lld",&m);
if(n==0)
{
puts("0");
continue;
}
for(i=1,x=10;i<19;i++,x*=10)
s[i]=(x-1)/n;
for(i=18;i>1;i--)
s[i]-=s[i-1];
for(i=1,x=0;i<19 && m>=s[i]*i;i++)
m-=s[i]*i,x+=s[i]*n;
x+=m/i*n;
if(m%i==0)
{
printf("%d\n",x%10);
continue;
}
x+=n;
i-=m%i;
while(i--)x/=10;
printf("%d\n",x%10);
}
return 0;
}
/*
//

//
*/


千万不要点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: