ZOJ_3681_E - Cup 2

看到acdream群裏面有朋友問到這題,於是看了一下

一開始還沒看懂,後面才理解題意

題目意思是這樣的 

爲了製造italy支持率高的假象

於是刻意安排合適分組以實現調查數據虛高的目的

樣例12 5

結果是12 6

正確的分組方法應該是這樣的

3 2:1    
3 2:1
3 2:1
3 0:3

如此一來就有三個組別支持italy

問題沒有這麼簡單

接下來的問題是還可以分組的要繼續分組

比如16, 你可以氛圍四組,也可以繼續再分為兩組於是乎這題變為了求約數

#include <iostream>
#include <stdio.h>
#include <map>
#include <algorithm>
#include <string.h>

using namespace std;
int l, a[20010];
map<int, int>mp;

int
main()
{
	int n, m;
	while(cin>>m>>n){
		if(m==1){
			if(n==1)
				cout<<"Yes"<<endl;
			else
				cout<<"No"<<endl;
			cout<<"1"<<endl;
			continue;
		}
		int ans=m;
		l=0;
		for(int i=1; i*i<=m; i++){
			if(m%i==0){
				a[l++]=i;
				if(m/i != i)
					a[l++]=m/i;		
			}
		} 
		sort(a, a+l);
		mp.clear();
		for(int i=1; i<l; i++){
			int tmp=a[i]/2 + 1;
			for(int j=1; j<i; j++){
				if(a[i]%a[j]==0){
					int tmp2=mp[a[j]] * mp[a[i]/a[j]];
					if(tmp2<tmp)
						tmp=tmp2;
				}
			}
			mp[a[i]]=tmp;
		}
		ans=mp[m];
		if(ans <= n)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
		cout<<ans<<endl;
		
	}
	return 0;
}

你可能感兴趣的:(ZOJ_3681_E - Cup 2)