打卡信奥刷题(2113)用C++实现信奥 P11909 [NHSPC 2023] H. 整数的回文分解法

P11909 [NHSPC 2023] H. 整数的回文分解法

题目描述

H 教授是一位密码学专家,他现在正在研究如何对一个正整数做特殊分解,因而发明了正整数的回文分解法,其分解方法如下:对于一个正整数 nnn,把 nnn 分解成 kkk 个正整数 x1,x2,…,xkx_1, x_2, \ldots, x_kx1,x2,,xk 的和,满足 n=x1+x2+…+xkn = x_1 + x_2 + \ldots + x_kn=x1+x2++xk,且 x1,x2,…,xkx_1, x_2, \ldots, x_kx1,x2,,xk 由左读到右和由右读到左相同。

当两种分解法分解出来的正整数数量不同,或者出现的次序不同时,则视为不同的分解法。更严谨地说,设 n=a1+a2+…+ak=b1+b2+…+bln = a_1 + a_2 + \ldots + a_k = b_1 + b_2 + \ldots + b_ln=a1+a2++ak=b1+b2++bl 为两种回文分解法。若 k≠lk \ne lk=l,或者 k=lk = lk=l 但存在 i∈{1,2,…,k}i \in \{1, 2, \ldots, k\}i{1,2,,k} 使得 ai≠bia_i \ne b_iai=bi,则视为不同的分解法。例如正整数 666888 种回文分解法,分别是

  1. 666
  2. 2+2+22 + 2 + 22+2+2
  3. 3+33 + 33+3
  4. 2+1+1+22 + 1 + 1 + 22+1+1+2
  5. 1+4+11 + 4 + 11+4+1
  6. 1+1+2+1+11 + 1 + 2 + 1 + 11+1+2+1+1
  7. 1+2+2+11 + 2 + 2 + 11+2+2+1
  8. 1+1+1+1+1+11 + 1 + 1 + 1 + 1 + 11+1+1+1+1+1

给定一个正整数 nnn,请写一个计算机程序去计算 nnn 有多少种不同的回文分解法。因为这个数字可能很大,你只要求出方法数除以 109+710^9 + 7109+7 的余数就行了。

输入格式

ttt
n1n_1n1
n2n_2n2
⋮\vdots
ntn_tnt

  • ttt 代表你的计算机程序需要处理的正整数 nnn 的个数。
  • nin_ini 代表第 iii 笔询问的正整数 nnn

输出格式

ans1\textrm{ans}_1ans1
ans2\textrm{ans}_2ans2
⋮\vdots
anst\textrm{ans}_tanst

  • ansi\textrm{ans}_iansi 代表 nin_ini 的回文分解方法数除以 109+710^9 + 7109+7 的余数。

输入输出样例 #1

输入 #1

2
3
6

输出 #1

2
8

说明/提示

测试数据限制

  • 1≤t≤1041 \le t \le 10^41t104
  • 1≤ni≤10151 \le n_i \le 10^{15}1ni1015
  • 输入的数皆为整数。

评分说明

本题共有四组子任务,条件限制如下所示。
每一组可有一或多个测试数据,该组所有测试数据皆需答对才可获得该组分数。

子任务分数额外输入限制
1101010输入的 nin_ini 两两相异,且 ni≤30n_i \le 30ni30
2303030ni≤1000n_i \le 1000ni1000
3101010ni≤106n_i \le 10^6ni106
4505050无额外限制

C++实现

#include<bits/stdc++.h>
using namespace std;
long long t,n,jl;
int main(){
	ios::sync_with_stdio(0);
	std::cin.tie(0);
	std::cout.tie(0); 
	cin>>t;
	while(t--){
		cin>>n;jl=1;
		long long x=n/2,z=2;
		while(1){
			if(x==0) break;
			if(x%2==1) 
				jl=(jl*z)%1000000007;
			z=(z*z)%1000000007;
			x=x/2;
		}
		cout<<jl<<"\n";
	}
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值