結果
| 問題 | No.6 使いものにならないハッシュ | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2018-10-03 11:37:04 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 4 ms / 5,000 ms | 
| コード長 | 1,512 bytes | 
| コンパイル時間 | 599 ms | 
| コンパイル使用メモリ | 68,640 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-09-16 16:44:56 | 
| 合計ジャッジ時間 | 1,619 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 32 | 
ソースコード
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
#include <utility>
using namespace std;
typedef long long ll;
ll MOD = 1e9+7;
int crypt(int num)
{
	int ret=0;
	while(1)
	{
		ret=0;
		while(num!=0)
		{
			ret+=num%10;
			num/=10;
		}
		if(ret<10)
			break;
		else
			num=ret;
	}
	return ret;
}
bool prime[200005];
int main()
{
	int n,k;
	vector<pair<int,int>> kou;
	int ans=0;
	cin>>k>>n;
	//エラトステネスのふるい
	fill(prime,prime+200005,true);
	prime[0]=false;
	prime[1]=false;
	for(int i=2;i<200005;i++)
	{
		if(prime[i])
		{
			for(int j=i*2;j<200005;j+=i)
				prime[j]=false;
		}
	}
	//k以上n以下の範囲の素数とそのハッシュを取り出す
	for(int i=k;i<n+1;i++)
	{
		if(prime[i])
			kou.push_back(make_pair(i,crypt(i)));
	}
	
	bool f[10];//0から9までどのくらい使われたか
	int cnt=0;//最大カウント
	int pos=0;//最大の最初の位置
	int i=0;
	/*
	for(int i=0;i<kou.size();i++)
		cerr<<kou[i].first<<" "<<kou[i].second<<endl;*/
	int c=0;
	int p=i;
	fill(f,f+10,false);
	while(i<kou.size())
	{
		//cerr<<p<<" "<<c<<endl;
		while(!f[kou[i].second])
		{
			f[kou[i].second]=true;
			c++;
			i++;
			if(i==kou.size())
				break;
		}
		if(c>=cnt)
		{
			cnt=c;
			pos=p;
		}
		//しゃくとり
		if(i<kou.size())
		{
			for(int j=p;j<i+1;j++)
			{
				f[kou[j].second]=false;
				c--;
				if(kou[j].second==kou[i].second)
				{
					p=j+1;
					break;
				}
			}
		}
	}
	cout<<kou[pos].first<<endl;
	return 0;
}
            
            
            
        