您的位置:首页 > 其它

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

2016-08-16 23:36 218 查看
题目链接:
  [b][b][b]http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1044[/b][/b][/b]

题目大意

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

题目思路:

  【数学】【模拟】

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

  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;
int cas,cass;
int n,m,lll,ans;
LL sum;
LL e
;
int get(LL x)
{
int i=1;
while(x>=e[i+1])i++;
return i;
}
int main()
{
#ifndef ONLINE_JUDGE
//	freopen("1.txt","r",stdin);
//	freopen("2.txt","w",stdout);
#endif
int i,j;
//	for(scanf("%d",&cas);cas;cas--)
//	for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
//	while(~scanf("%s",s))
e[0]=0,e[1]=1;
for(i=2;i<=19;i++)e[i]=e[i-1]*10;
while(~scanf("%d",&n))
{
scanf("%d",&m);
i=0;
j=get(n);
for(sum=n;i<m;sum+=n,i+=j)
{
if(sum>=e[j+1])j++;
}
sum-=n;
if(i==m)printf("%d\n",sum%10);
else
{
i=m-(i-j);
printf("%d\n",sum/e[j-i+1]%10);
}
}
return 0;
}
/*
//

//
*/


 数学:

//
//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;
}
/*
//

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