DUTOJ1205(大数)
1205: 對(duì)圣杯寶具的威力值
Time Limit:3000/1000 MS (Java/Others)???Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:179???Accepted:34
[Submit][Status][Discuss]
Description
當(dāng)我掏出咖喱棒,沒(méi)有圣杯能夠立在我的面前。
對(duì)圣杯寶具咖喱棒是saber擁有的一種大規(guī)模殺傷性武器,士郎很好奇saber手中的咖喱棒到底有多大威力,于是他開(kāi)始觀察咖喱棒釋放時(shí)出現(xiàn)的光粒。他認(rèn)為,咖喱棒的威力值與光粒的數(shù)量存在某種關(guān)系。
光粒的數(shù)目是一個(gè)很大的整數(shù)xx,士郎發(fā)現(xiàn),咖喱棒的威力值恰好是lowbit(x)。即把x轉(zhuǎn)化為2進(jìn)制后,只保留最低位的1及其后面的0,去掉前面的內(nèi)容,所代表的10進(jìn)制數(shù),如6(110)的lowbit為2(10),12(1100)的lowbit為4(100),20(10100)的lowbit也為4(100)。
切嗣并沒(méi)有教士郎怎么使用電腦,所以士郎想請(qǐng)你幫忙算出咖喱棒的威力值,這個(gè)威力值可能很大所以你只需要輸出它除109+7109+7的余數(shù)即可。
本題數(shù)據(jù)組數(shù):不計(jì)樣例僅1組
Input
第一行輸入一個(gè)整數(shù)t,表示測(cè)試數(shù)據(jù)組數(shù)。
接下來(lái)t行,輸入一行,一個(gè)長(zhǎng)度不超過(guò)103103的字符串,代表光粒數(shù)xx。
Output
?輸出t行,每行一個(gè)整數(shù),表示取模后的威力值對(duì)取余后的109+7109+7值
Sample Input
140Sample Output
8HINT
吾王劍鋒所指,吾等心之所向
?
湯大佬出的大數(shù),沒(méi)有卡常數(shù),只要判斷末尾是不是奇數(shù)然后一直除以二就好。提供兩種寫(xiě)法一種是正常寫(xiě)法(16ms)另一個(gè)是int存4位數(shù)字(5ms),大幅度底稿運(yùn)算速度,poj上有一題求階乘只有用這種騷操作才過(guò)得了。將來(lái)不那么菜了學(xué)學(xué)python和java應(yīng)該會(huì)好寫(xiě)很多。
#include<bits/stdc++.h> using namespace std; int len; char ss[3100];int st;int s[3100]; void chu() { int flag=1; for(int i=st;i<len;i++) { if(s[i]&1) { s[i+1]+=10; } s[i]=s[i]>>1; if(flag) { if(s[i]==0) { st++; } else flag=0; } } } int main(){ int t;int ans; scanf("%d",&t); while(t--) { scanf("%s",ss); len=strlen(ss); for(int i=0;i<len;i++) { s[i]=ss[i]-'0'; } ans=1;st=0; //printf("%d~~\n",s[len-1]&1); while(!(s[len-1]&1)) { chu(); ? //printf("!!\n"); ans=ans<<1;ans%=1000000007; } printf("%d\n",ans); }}?
方法2
? ?? ? ?
?
? ??
總結(jié)
以上是生活随笔為你收集整理的DUTOJ1205(大数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。