sicily 1028

大数求余。。。

//规律第pth元素 p = (2 * i + 1) * 2^(n - 1); //n即为该元素. #include <iostream> #include <cstring> using namespace std; struct num { int dig[110]; int len; num operator = (num* tmp) { memcpy(dig, tmp->dig, sizeof(dig)); len = tmp->len; return *this; } num(char *tmp, int len) { this->len = len; int k = 0; for(int i = len - 1; i >= 0; i--) dig[k++] = tmp[i] - '0'; } num() { memset(dig, 0, sizeof(dig)); len = 0; } }; char data[110]; int len; int d; //余数 void div(num* a, int b) { int i; for(i = a->len - 1, d = 0; i >= 0; i--) { d = d * 10 + a->dig[i]; a->dig[i] = d/b; d = d % b; } while(a->len && a->dig[a->len - 1] == 0) a->len--; } int main() { //freopen("C:/Users/Alfred/Desktop/1.txt", "r", stdin); int T; cin >> T; for(int j = 1; j <= T; j++) { if(j != 1) cout << endl; memset(data, 0, sizeof(data)); cin >> data; len = strlen(data); if((data[len - 1] - '0') % 2 != 0) { cout << "Case " << j << ": " << 1 << endl; continue; } num ans(data, len); for(int i = 1; ; i++) { div(&ans, 2); //刚开始直接求1 << i的模,TLE if((ans.dig[0] - '0') % 2 != 0) { cout << "Case " << j << ": " << i + 1 << endl; break; } } } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值