有一个从1 to N编号的N个城市的列表。
任务是从列表中选择城市/城市的选择方式。
必须至少选出一个城市。由于答案可能很大,请打印答案模块10^9+7
Examples
Input Output
2 (test cases)
2 3
1 1对于测试用例1:选择城市的唯一方法是1,2,12,因此答案是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。
谢谢
发布于 2016-11-05 06:58:05
答案是所有可能的子集(除空集外)的数目,这些子集是2^n - 1。
由于2^n将非常大,这就是问题要求进行模块化操作的原因,因此您必须执行模指数来计算2^n。
#include<stdio.h>
#include<math.h>
#define MOD 1000000007
// calculate (b^e) % MOD
long long powerMod(long long b, long long e)
{
long long ret = 1;
b %= MOD;
while(e > 0)
{
if(e & 1) {
ret = (ret * b) % MOD;
}
b = (b * b) % MOD;
e >>= 1;
}
return ret % MOD;
}
int main()
{
long long tcase, n;
scanf("%lld",&tcase);
while(tcase--)
{
scanf("%lld", &n);
long long result = powerMod(2, n) - 1;
printf("%lld\n", result);
}
return 0;
}发布于 2016-11-05 06:27:25
您可以使用二进制指数算法在对数时间内解决每个测试用例。
https://stackoverflow.com/questions/40435385
复制相似问题