有一个N个城市的列表,编号从1 to N
开始。
任务是选择从列表中选择城市/城市的方式。
必须至少选择一个城市。由于答案可能很大,请以10^9+7
Examples
Input Output
2 (test cases)
2 3
1 1
对于测试用例1:选择城市的唯一方法是1,2,1 2 因此答案是3。
对于测试案例2:选择城市的唯一方法是1因此 答案是1。
我尝试了以下方式(C语言):
#include<stdio.h>
#include<math.h>
const long int REM = 1000000000+7;
int main()
{
int t; scanf("%d",&t); while(t--) {
long long int n; scanf("%lld",&n);
long long int res=1;
for(long long int i=0;i<n;i++) {
res<<=1;
res%=(REM);
}
printf("%lld\n",res-1);
}
return 0;
}
这给了我超时限制。请建议我更好performance algorithm
。
谢谢
答案 0 :(得分:3)
答案是所有可能子集的数量(空集除外).TosString()
。
由于2^n - 1
非常大,这就是问题要求进行模块化操作的原因,您必须执行Modular Exponentiation来计算2^n
。
2^n
答案 1 :(得分:2)
您可以使用二进制求幂算法以对数时间解决每个测试用例。