列表

详情


NC23324. Tachibana Kanade Loves Probability

描述

立华奏在学习初中数学的时候遇到了这样一道大水题:
“设箱子内有 n 个球,其中给 m 个球打上标记,设一次摸球摸到每一个球的概率均等,求一次摸球摸到打标记的球的概率”
“emmm...语言入门题”
但是她改了一下询问方式:设最终的答案为 p ,请输出 p 小数点后 K_1K_2 位的所有数字(若不足则用 0 补齐)

输入描述

第一行一个整数 T,表示有 T 组数据。
接下来每行包含四个整数 m,n,K_1,K_2,意义如「题目描述」所示。

输出描述

输出 T 行,每行输出  个数,表示答案。
注意同行的数字中间不需要用空格隔开。

示例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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 173ms, 内存消耗: 1544K, 提交时间: 2020-02-14 22:57:24

#include<iostream>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		long long m,n,k1,k2;
		cin>>m>>n>>k1>>k2;
		long long ans=m,b=k1-1;
		long long a=10;
		while(b)
		{
			if(b&1)
			ans=ans*a%n;
			a=a*a%n;
			b>>=1;
		}
		for(int i=k1;i<=k2;i++)
		{
			ans*=10;
			cout<<ans/n;
			ans%=n;
		}
		cout<<endl;
	 } 
	 return 0;
}

C++14(g++5.4) 解法, 执行用时: 142ms, 内存消耗: 1636K, 提交时间: 2019-04-08 20:05:23

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int m,n,k1,k2;
		cin>>m>>n>>k1>>k2;
		long long t=k1-1,a=10,ans=m;
		while(t)
		{
			if(t&1)
			ans=ans*a%n;
			a=a*a%n;
			t/=2;
		}
		for(long long i=k1;i<=k2;i++)
		{
			ans*=10;
			cout<<ans/n;
			ans%=n;
		}
		cout<<endl;
	}
}

Python3(3.5.2) 解法, 执行用时: 1893ms, 内存消耗: 5872K, 提交时间: 2019-04-06 06:01:57

t = int(input())
i = 0
while i < t:
    m, n, k1, k2 = map(int, input().split())
    ans = (m % n * pow(10, k1 - 1, n)) % n
    while k1 <= k2:
        print(ans * 10 // n, end="")
        k1 += 1
        ans *= 10
        ans %= n
    print("")
    i += 1

上一题