博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACM-ICPC 2018 焦作赛区网络预赛G Give Candies(隔板定理 + 小费马定理 + 大数取模,组合数求和)题解...
阅读量:6693 次
发布时间:2019-06-25

本文共 1340 字,大约阅读时间需要 4 分钟。

题意:给你n个东西,叫你把n分成任意段,这样的分法有几种(例如3:1 1 1,1 2,2 1,3 ;所以3共有4种),n最多有1e5位,答案取模p = 1e9+7

思路:就是往n个东西中间插任意个板子,所以最多能插n - 1个,所以答案为2^(n - 1) % p。但是n最大有1e5位数,所以要用小费马定理化简。

小费马定理:假如p是质数,且gcd(a,p)=1,那么a (p-1)≡1(mod p)

所以我们只要把n - 1分解为n - 1 = k(p - 1) + m,而2^ k(p - 1) % p ≡1,所以2^(n - 1) % p = 2^m % p,化简完成。

所以我们把n - 1对p-1取模,用了大数取模

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;const int maxn = 1e5 + 10;const int seed = 131;const ll MOD = 1e9 + 7;const ll MOD1 = 1e9 + 6;const int INF = 0x3f3f3f3f;using namespace std;char num[maxn];/*ll getmod(){ ll ans = num[0] - '0'; int len = strlen(num); for(int i = 1; i < len; i++) ans = (ans * 10 + num[i] - '0') % MOD1; return ans - 1;}*/ll getmod(){ ll ans = num[0] - '0'; int len = strlen(num); for(int i = 1; i < len - 1; i++) ans = (ans * 10 + num[i] - '0') % MOD1; if(len > 1) ans = ans * 10 + num[len - 1] - '0'; return (ans - 1) % MOD1;}ll pmul(ll a, ll b){ ll ans = 1; while(b){ if(b & 1) ans = (ans * a) % MOD; a = a * a % MOD; b >>= 1; } return ans;}int main(){ int T; ll n, p; scanf("%d", &T); while(T--){ scanf("%s", num); p = getmod(); printf("%lld\n", pmul(2, p)); } return 0;}

 

转载于:https://www.cnblogs.com/KirinSB/p/9651627.html

你可能感兴趣的文章
Java AtomicInteger的用法
查看>>
利用公有云平台构建网站项目总结
查看>>
php 与 C# 之间的DES加解密
查看>>
NetApp DataONTAP 集群模式 学习笔记2
查看>>
网络营销的优势
查看>>
允许java运行不安全或不可信的应用程序
查看>>
Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之环境部署
查看>>
思科三层网络设计公式
查看>>
Groovy基本类型与运算符
查看>>
rabbitmq java.util.concurrent.TimeoutException
查看>>
IPsec***
查看>>
sql语句优化的十二条建议
查看>>
《数据库系统概念》5-连接、视图和事务
查看>>
那些亮瞎你的奇葩癖好!别再说程序猿不会玩了
查看>>
memcached安装与应用
查看>>
AWS举行AI大会re:MARS 焦点ML、自动化、机器人和太空科学
查看>>
Python正则表达式初识(四)
查看>>
构建LVS负载均衡群集
查看>>
VirtualBox的四种网络连接方式
查看>>
fir.im Weekly - 如果让你重新做一款APP
查看>>