列表

详情


NC22614. 小y的盒子

描述

小y现在有一个神奇的盒子。盒子里面有红蓝两种卡片。每种卡片都有n张,其中第i张上的数字为。小y想从盒子中取出一些卡片。使得这些卡片的和为m。他想知道有多少种方案。
小k又觉得此题太水,所以出题人只好又加强了一下。
现在你需要将m从1枚举到S,S为盒子中所有卡片数字之和。问所有方案之和。
也就是说设f(m)表示取出的卡片数字之和为m的方案数。你需要求
由于答案可能巨大,你需要输出答案对P取模的结果

输入描述

第一行一个正整数T。表示数据组数
然后2n行每行一个正整数n,P交替。表示卡片的个数和模数

输出描述

输出共T行。每行一个正整数。
第i行表示第i组数据的答案。

示例1

输入:

1
1
100

输出:

3

原站题解

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

Java(javac 1.8) 解法, 执行用时: 1121ms, 内存消耗: 28492K, 提交时间: 2019-04-26 16:56:00

import java.util.*;
import java.math.*;
public class Main {
	public static void main(String[] args)
	{
		Scanner in=new Scanner(System.in);
		int T=in.nextInt();
		for(int i=1; i<=T; i++)
		{
			BigInteger n=in.nextBigInteger(), p=in.nextBigInteger(), ko=new BigInteger("4"), on=new BigInteger("1");
			System.out.println(ko.modPow(n, p).subtract(on).add(p).remainder(p));
		}
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 95ms, 内存消耗: 740K, 提交时间: 2019-04-21 15:32:31

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	char s[100005];
	scanf("%d",&T);
	while(T--){
		long long p;
		scanf("%s%lld",&s,&p);
		int l1=strlen(s);
		int b=4;
		long long ans=1;
		for(int i=l1-1;i>=0;i--){
			for(int j=0;j<s[i]-'0';j++)
				ans=ans*b%p;
			int a=b;
			for(int i=1;i<10;i++)
				a=1ll*a*b%p;
			b=a;
		}
		printf("%d\n",(ans+p-1)%p);
	}
	
}

pypy3(pypy3.6.1) 解法, 执行用时: 145ms, 内存消耗: 20888K, 提交时间: 2020-10-23 20:45:37

t=int(input())
for i in range(t) :
    ans=1
    n=int(input())
    mod=int(input())
    print((pow(4,n,mod)-1+mod)%mod)

Python3(3.5.2) 解法, 执行用时: 200ms, 内存消耗: 4328K, 提交时间: 2019-04-24 10:27:15

import math;
t=int(input());
while t:
 n=int(input());
 p=int(input());
 print((pow(4,n,p)-1+p)%p);
 t-=1;

上一题