【牛客 - 318L】彪神666(水题,半高精度,递推,trick)
題干:
?
在國外,666代表魔鬼,777代表上帝。
所以牛逼的彪神就非常不喜歡6這個數字。
有一天彪神突發奇想,,他想求一些書與6無關的數。
如果一個數能被6整除,或者它的十進制表示法中某位上的數字為6,則稱其為與6相關的數。彪神要求所有小于等于N的與6無關的正整數的平方和。
輸入描述:
?第一行一個數T表示有T組數據。(T≤20)
后面T行數每行一個N,表示求所有小于等于N的與6無關的正整數的平方和。(N≤106)
輸出描述:
T行,每行一個數表示求所有小于等于N的與6無關的正整數的平方和。示例1
輸入
復制
5 4 5 6 7 8輸出
復制
30 55 55 104 168解題報告:
? ? ?水題,打表遞推一下就可以了。。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e6 + 5; ll mod = 1e13; ll b[MAX],bb[MAX]; int a[55]; int cf(int x) {int p = 0;while(x) {a[++p] = x%10;x/=10;}return p; } int main() {for(ll i = 1; i<=(int)1e6; i++) {b[i]=b[i-1];bb[i]=bb[i-1];int p = cf(i),flag = 1;for(int j = 1; j<=p; j++) {if(a[j]==6) {flag = 0;break;}}if(i%6==0) flag=0;if(flag == 1) {b[i] += i*i;bb[i] +=b[i]/mod;b[i]%=mod;}}int t,n;cin>>t;while(t--) {scanf("%d",&n);if(bb[n]==0) printf("%lld\n",b[n]);else printf("%lld%.13lld\n",bb[n],b[n]);}return 0 ;}總結:
暈,,這題debug一年。。思維過程是這樣的、、打表的時候是用的int i打的,,所以導致i*i爆了int,,但是沒發現,,還以為是最終答案爆了longlong,,開了半個高精度,,發現還是不對,,往前面查,,發現i*i爆了int,于是改成longlong,,再交還是wa,,放棄、、賽后發現高精度寫掛了。。低位的數組沒有按位補齊。。。然后后來簡單證明了一下發現是不會超longlong的(我就說嘛如果是個高精度的坑不可能這么多人當簽到題過啊)也就是這題本來就是i*i爆了int而已、、結果越改越掛了。。還有啊之前暑假那個半高精度那個題,之所以沒加格式符是因為是對1e18取余,,并且取余之后低位的數組依舊是18位的,,所以不用加。
所以對這個代碼中,其實把mod改成1e18,然后把main函數中的格式符去掉,就可以直接ac了
總結
以上是生活随笔為你收集整理的【牛客 - 318L】彪神666(水题,半高精度,递推,trick)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BZOJ - 3436】小K的农场(差
- 下一篇: 信用卡申请未通过原因 避开这四点秒批不是