結果
問題 | No.434 占い |
ユーザー |
![]() |
提出日時 | 2016-05-03 22:24:31 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 31 ms / 2,000 ms |
コード長 | 1,752 bytes |
コンパイル時間 | 1,519 ms |
コンパイル使用メモリ | 169,304 KB |
実行使用メモリ | 8,464 KB |
最終ジャッジ日時 | 2024-10-11 00:23:41 |
合計ジャッジ時間 | 3,402 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 27 |
ソースコード
#include <bits/stdc++.h>#define _overload(_1,_2,_3,name,...) name#define _rep(i,n) _range(i,0,n)#define _range(i,a,b) for(int i=int(a);i<int(b);++i)#define rep(...) _overload(__VA_ARGS__,_range,_rep,)(__VA_ARGS__)#define _rrep(i,n) _rrange(i,n,0)#define _rrange(i,a,b) for(int i=int(a)-1;i>=int(b);--i)#define rrep(...) _overload(__VA_ARGS__,_rrange,_rrep,)(__VA_ARGS__)using namespace std;using ll=long long;const int limit=100000;char s[limit+1];int divisor[limit+1],prime[limit+1];int factor[limit+1][10];void init(){int total=0;for(int i=2;i<=limit;++i) divisor[i]=i;for(int p=2;p<=limit;++p){if(divisor[p]==p)prime[total++]=p;for(int i=0;i<total && prime[i]<=divisor[p];++i){int tmp=prime[i]*p;if(tmp<=limit)divisor[tmp]=prime[i];elsebreak;}}for(int i=2;i<=limit;++i){if(divisor[i]==i){factor[i][i%9]++;}else{rep(j,10) factor[i][j]=factor[i/divisor[i]][j];factor[i][divisor[i]%9]++;}}return;}int power(int a,int n,int mod){int b=1;while(n){if(n&1) b=b*a%mod;a=a*a%mod;n>>=1;}return b;}int main(void){init();int t,all=0;scanf("%d",&t);assert(1<=t && t<=limit);rep(loop,t){scanf("%s",s);int n=strlen(s);assert(1<=n && n<=limit);rep(i,n) assert(isdigit(s[i]));all+=n;bool allzero=true;rep(i,n) if(s[i]!='0') allzero=false;if(allzero){puts("0");continue;}int ans=0,f[10];fill(f,f+10,0);int num=n-1,den=1;rep(i,n){int cur=s[i]-'0';rep(j,10) cur=(cur*power(j,f[j],9))%9;ans=(ans+cur)%9;rep(j,10) f[j]+=factor[num][j];rep(j,10) f[j]-=factor[den][j];num--,den++;}if(ans==0) ans=9;printf("%d\n",ans);}assert(all<=limit);return 0;}