博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
组合数学之Polya计数 TOJ1116 Let it Bead
阅读量:5978 次
发布时间:2019-06-20

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

1116: Let it Bead 分享至QQ空间

Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte
Total Submit: 7            Accepted:4

Description

"Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is beads. Their PR department found out that customers are interested in buying colored bracelets. However, over 90 percent of the target audience insists that the bracelets be unique. (Just imagine what happened if two women showed up at the same party wearing identical bracelets!) It's a good thing that bracelets can have different lengths and need not be made of beads of one color. Help the boss estimating maximum profit by calculating how many different bracelets can be produced. 

A bracelet is a ring-like sequence of s beads each of which can have one of c distinct colors. The ring is closed, i.e. has no beginning or end, and has no direction. Assume an unlimited supply of beads of each color. For different values of s and c, calculate the number of different bracelets that can be made.

Input

Every line of the input file defines a test case and contains two integers: the number of available colors c followed by the length of the bracelets s. Input is terminated by c=s=0. Otherwise, both are positive,and, due to technical difficulties in the bracelet-fabrication-machine, cs<=32, i.e. their product does not exceed 32.

Output

 

For each test case output on a single line the number of unique bracelets. The figure below shows the 8 different bracelets that can be made with 2 colors and 5 beads.

 

Sample Input

 

1 1

2 1
2 2
5 1
2 5
2 6
6 2
0 0

Sample Output

1

2
3
5
8
13
21

经典题目

#include
#include
int eular(int n){ int ret=1,i; for(i=2; i*i<=n; i++) { if(n%i==0) { ret*=i-1; n/=i; while(n%i==0) { n=n/i; ret*=i; } } if(n==1) break; } if(n>1) ret*=n-1; return ret;}int po(int a,int b){ int ret=1,i; for(i=1; i<=b; i++) ret*=a; return ret;}int main(){ int n,ans,i,m; while(~scanf("%d%d",&m,&n)) { if(!n&&!m)break; ans=0; for(i=1; i*i

 也是很优秀的写法

#include
using namespace std;int c,n,ans;int po(int p,int n){ int ans=1; while(n) { if(n&1)ans*=p; p*=p,n>>=1; } return ans;}int main(){ while(cin>>c>>n&&(c||n)) { ans=0; for(int i=1; i<=n; i++) ans+=po(c,__gcd(n,i)); if(n&1) ans+=n*po(c,n/2+1); else ans+=(po(c,n/2+1)+po(c,n/2))*(n/2); cout<

 

转载于:https://www.cnblogs.com/BobHuang/p/8794897.html

你可能感兴趣的文章
hbase region split源码分析
查看>>
MySQL备份之分库分表备份脚本
查看>>
Java 与 Netty 实现高性能高并发
查看>>
SurfControl人工智能新突破 领跑反垃圾邮件
查看>>
一个动态ACL的案例
查看>>
openstack 之 windows server 2008镜像制作
查看>>
VI快捷键攻略
查看>>
Win server 2012 R2 文件服务器--(三)配额限制
查看>>
卓越质量管理成就创新高地 中关村软件园再出发
查看>>
linux rsync 远程同步
查看>>
httpd的manual列目录漏洞
查看>>
myeclipse2014破解过程
查看>>
漫谈几种反编译对抗技术
查看>>
Timer 和 TimerTask 例子
查看>>
Spring BOOT 集成 RabbitMq 实战操作(一)
查看>>
安装python3.5注意事项及相关命令
查看>>
进程通信之无名信号量
查看>>
并发串行调用接口
查看>>
CMD 修改Host文件 BAT
查看>>
android幻灯片效果实现-Gallery
查看>>