链接:https://ac.nowcoder.com/acm/contest/548/B
来源:牛客网
题目描述
立华奏在学习初中数学的时候遇到了这样一道大水题:
“设箱子内有 n 个球,其中给 m 个球打上标记,设一次摸球摸到每一个球的概率均等,求一次摸球摸到打标记的球的概率”
“emmm...语言入门题”
但是她改了一下询问方式:设最终的答案为 p ,请输出 p 小数点后 K1K1 到 K2K2 位的所有数字(若不足则用 0 补齐)
输入描述:
第一行一个整数 T,表示有 T 组数据。
接下来每行包含四个整数 m,n,K1,K2m,n,K1,K2,意义如「题目描述」所示。
输出描述:
输出 T 行,每行输出 K2−K1+1K2−K1+1 个数,表示答案。
注意同行的数字中间不需要用空格隔开。
示例1
输入
5
2 3 2 3
1 7 1 7
2 5 1 3
12345 54321 3 10
12345 54321 100000 100010
输出
66
1428571
400
72601756
78428232175
备注:
1≤m≤n≤109,1≤K1≤K2≤1091≤m≤n≤109,1≤K1≤K2≤109;
0≤K2−K1≤105,T≤200≤K2−K1≤105,T≤20。
利用快速幂优化求出第一个第一位的数值,然后模拟除法求出全部解并输出。
//#include<bits/stdc++.h>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define sdddd(x,y,z,k) scanf("%d%d%d%d", &x, &y, &z, &k)
#define sddd(x,y,z) scanf("%d%d%d", &x, &y, &z)
#define sdd(x,y) scanf("%d%d", &x, &y)
#define sd(x) scanf("%d", &x)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
//#define mp make_pair
#define pb push_back
#define ms(x, y) memset(x, y, sizeof x)
#define MOD 10000
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 10050;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
//typedef vector<ll> vec;
//typedef vector<vec> mat;
long long a, n, m, t, k1, k2;
int arra[maxn];
int arrb[maxn];
vector<int> vec;
void print()
{
int len = k2 - k1+1;
k1--;
n = n%m;
long long base = 10;
while(k1){
if(k1 & 1) n = n*base%m;
base = base * base % m;
k1 >>= 1;
//printf("%d", n*10/m);
}
while(len--)
{
int k = (n*10/m);
cout << k;
n = n*10%m;
}
}
int main()
{
//std::ios::sync_with_stdio(false);
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> t;
while(t--){
cin >> n >> m >> k1 >> k2;
print();
cout << endl;
}
return 0;
}